AWSでサーバーレス開発：Docker × ECR × Lambda × API GatewayにGitHub Actionsを追加してみた結果...

## はじめに
前回は、Dockerイメージを基にECRからLambdaを構築し、API GatewayをトリガーとしてLambdaから「Hello from Lambda!」を実装しました。

:::note warn
**今回はその追加機能として、「GitHub Actions」を設定し、`main`ブランチに変更があった際に、コードをECRに自動デプロイする仕組みを構築します。**
:::

結果からお伝えすると、「GitHub Actions」を設定し、`main`ブランチに変更があった際のECRへの自動デプロイは実現できました。***しかし、その後の「Lambda × API Gateway」の部分で問題が発生しました。***

今回は、この問題がなぜ発生したのかに焦点を当てて、自分なりに考察をまとめていきます。

## 前回の続きになります
1本目では、ローカル環境でDockerfileを作成し、AWS CLIを使用してDockerイメージをECRにプッシュする手順を解説しました。

👉 **Dockerイメージの作成とECRへのプッシュ**

https://qiita.com/free-honda/items/a93afb0ca7fecf443460

2本目では、Lambda関数を使用するために必要なIAMロールの作成や権限の設定について解説しました。

***AWS CLIを使用してIAMの権限設定を行う方法を詳しくご紹介しています。***

👉 **IAMロールと権限設定について**

https://qiita.com/free-honda/items/488ce653fbffb8bacf3d

3本目では、ECRにアップロードしたDockerイメージをAWS Lambdaで実行し、サーバーレス環境で「***Hello from Lambda!***」を実現する手順を紹介しました。

👉 **Docker×ECR×Lambdaで「Hello from Lambda!」してみた**

https://qiita.com/free-honda/items/ec6f601f0bf95d3264ec

4本目では、ECRにプッシュしたDockerイメージを基にLambdaを実行し、API Gatewayを利用してHTTPリクエストに応じてLambda関数を呼び出す構成を構築しました。

👉 **Docker × ECR × Lambda × API Gatewayを組み合わせたサーバーレスアーキテクチャを構築してみた**

https://qiita.com/free-honda/items/8014807dafcab622c961

## こんなイメージのことをしようと頑張りました（一部うまくいかなかった）
ローカル環境のDockerイメージをGitHub上のリポジトリのmainブランチにプッシュした際に、GitHub Actionsを使ってECRへ自動デプロイを行いました。

**この手順自体は、過去の技術検証でも行っており、特につまずくことなくスムーズに作業できました。**

https://qiita.com/free-honda/items/da83c5dd44650c883164

***この構成は、Dockerイメージを基にAWS Lambdaを構築し、API Gatewayをトリガーとして利用したサーバーレスアーキテクチャです。***

![Screenshot 2025-01-15 at 5.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/367b5c8a-ffb4-12b5-de25-31c54e0c3bce.png)

ECRを基にAWS Lambdaを構築し、API GatewayのHTTP APIをトリガーとして、ブラウザ上で『"Hello from Lambda!"』と表示することを目標にしていました。

:::note alert
**しかし、ECRとLambdaの間でうまく連携できない部分があることが判明したため、その問題点を整理していきます。**
:::

### どこがうまくいっていないのか？
今回、ローカル環境でGitHub上の`main`リポジトリにプッシュがあった場合に、GitHub Actionsを使ってECRに自動デプロイすることは成功しました。

しかし、Lambda関数がECRの最新イメージURLを正しく読み込めず、古いイメージを使用し続ける問題が発生しました。

![Screenshot 2025-01-15 at 9.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/618f1121-bfb5-0f2d-0cfe-b59be21e0655.png)

**そのため、変更を加えた内容が反映されない状態となっています。**

:::note alert
**この問題を解決する手段は、現時点では思いつかなかったため、技術検証をここで一旦断念しました。**
:::

以降では、実際にGitHub Actionsを実行した際の内容についてお伝えします。

## GitHub Actionsを実行してみた
### 前提条件
GitHubリポジトリおよびGitHub Secretsの設定が完了していることが必要です。

***これらの詳細手順については、以下の記事を参考にしてください。***

👉 GitHubリポジトリの準備

https://qiita.com/free-honda/items/da83c5dd44650c883164#github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%BA%96%E5%82%99

### Dockerfileと関連ファイルの変更をコミット

多くのリポジトリでは、`main`がデフォルトブランチとして設定されています。

ここでは、変更したDockerfileや関連ファイルをコミットしてプッシュします。

```bash
git add Dockerfile
git commit -m "Update Dockerfile and related configurations"
git push origin main
```

### GitHub Actionsの実行確認

変更をプッシュした後、GitHubの「Actions」タブに移動し、ワークフローが正しく実行されているか確認します。

![Screenshot 2025-01-15 at 9.48.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/70e78faa-5e82-1c7a-15d6-277d47cda44d.png)

:::note warn
**約39秒後、Dockerイメージが正常にECRへプッシュされていることが確認できました。**
:::

### AWS管理コンソールでの確認

AWS管理コンソールのECRサービス画面で、想定通りDockerイメージがアップロードされていることを確認しました。

![Screenshot 2025-01-15 at 9.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5a1345d1-c314-5066-2e20-ad45bc7a36bf.png)

## まとめ
最後までお読みいただきありがとうございました。***今回は、自分の思っている形を実現することができませんでしたが、自己分析できてまとめることができました***

:::note info
**今回できなかった点については、おそらくラムダ関数などを使う必要があると思っていますので、また調べて実装してみようと思います**
:::

***この内容がどなたかの技術の支えになれば幸いです。***

## おまけ：GitHub Actionsが成功したときのアイコンがかっこいい
いつも思うのですが、GitHub Actionsが成功した際にブラウザのアイコンに表示されるチェックマーク、とても気に入っています！笑

![Screenshot 2025-01-15 at 11.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/15f8e0c5-3424-c2e1-22c9-13aa6879c96f.png)

***このチェックマークをもっと見るためにも、技術を磨き続けていきたいと思います！***