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

## はじめに
ECRにプッシュしたDockerファイルを基にLambdaを実行し、API Gatewayを利用してHTTPリクエストに応じてLambda関数を呼び出す構成を構築しました。

:::note warn
**最終的には、URLにアクセスするとブラウザ上で『***"Hello from Lambda!"***』と表示される仕組みになっています。**
:::

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

## 前回の続きになります
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

まさかここまで技術検証が広がるとは思いませんでしたが、次がラストです！

:::note
**GitHub Actionsを実装して、このシリーズを締めくくりたいと思っています（笑）**
:::

## こんなイメージのことをしています
Dockerイメージを基にAWS Lambdaを構築し、そのLambdaをトリガーとしてAPI Gatewayを用いたHTTP APIを作成しました。

![Screenshot 2025-01-14 at 15.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/480db84e-216c-ea6e-cf71-7314b207d00e.png)
引用画像：https://qiita.com/Shoma0210/items/928b90e346a0aa1154b0

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

## 前提条件

***以下の項目が事前に設定・完了している必要があります。***

- AWS CLI が設定済み
  - AWS CLI をインストールし、適切に設定されていること。

- Docker がインストール済み
  - Docker がインストールされ、正常に動作する環境が整っていること。

- ECR のリポジトリが作成済み
  - コンテナイメージをアップロードするためのリポジトリが用意されていること。

- 必要な IAM 権限が設定済み
  - Lambda 関数の実行や ECR へのアクセスに必要な IAM ロールと権限が構成されていること。

:::note warn
***さらに、Lambdaを手動で実行し、以下のように成功していることを前提として進めます。***
:::

**テストの実行と結果**

作成したイベントファイルを使用してLambda関数をテストすると、以下のように実行ログが即座に出力されます。

```実行.log
{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}
```

以下のスクリーンショットの通り、実行中のLambda関数が成功ステータスを返し、期待通りに動作していることを確認しました。

![Screenshot 2025-01-14 at 8.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cf3f556e-0f6b-158c-5a28-16a5b0c9daf1.png)

## API Gatewayを設定してみた
Lambda関数をAPI Gatewayと統合することで、HTTPリクエストに応じてLambda関数を呼び出せるようにします。

**今回は、過去に投稿した以下の記事の手順を参考にしながら進めています：**

https://qiita.com/free-honda/items/d5c8502cc019b94aa061#api-gateway%E3%81%A8lambda%E9%96%A2%E6%95%B0%E3%81%AE%E9%80%A3%E6%90%BA

### HTTP APIの構築

HTTP APIの構築ボタンをクリックすると、画面が遷移します。

![Screenshot 2025-01-14 at 15.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/92dc2d07-1458-8e88-ca73-b13a479dca47.png)

### APIの作成

作成画面で、事前に作成したLambda関数を選択し、API名を任意のものに設定して進みます。

![Screenshot 2025-01-14 at 15.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1d2040d2-c19a-2d01-d1fd-3c7d92aebf12.png)

### ルートの作成

「ルートの作成」をクリックし、GETリクエスト用のルートを作成します（例: `/static-page`）。

![Screenshot 2025-01-14 at 15.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ed811de7-aae0-4a34-52f1-91646c345e73.png)

### ステージの設定

APIをデプロイするために、個別設定可能な環境のステージとして「prod（任意）」を作成します。

![Screenshot 2025-01-14 at 15.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/72d7382c-e49a-009b-325b-accb0a4bb43e.png)

## 実際にデプロイしてみた

### デプロイの実行

画面右上の「デプロイ」を選択し、画面が変わることを確認します。

![Screenshot 2025-01-14 at 15.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3572ed09-4ee4-1775-8bb5-6b8a0e266cca.png)

### ステージの選択

作成したステージ名をプルダウンで選択し、右下の「デプロイ」をクリックします。

![Screenshot 2025-01-14 at 15.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9801eef5-52e5-c945-14d5-b7996f6054f5.png)

:::note warn
**作成したAPI Gatewayをprod環境にデプロイした後、API GatewayのエンドポイントURLにブラウザからアクセスしてください。**
:::

### エンドポイントURLへのアクセス

URLの末尾にはルートとして選択したパスを入力する必要がありますので、ご注意ください。

```bash
https://3d9pkvu1q6.execute-api.ap-northeast-1.amazonaws.com/prod/my-container-lambda
```

### 結果の確認

ブラウザでエンドポイントURLにアクセスすると、Lambda関数が正しく実行され、エラーなく終了しました。

**また、ログからも成功していることを確認しました。**

![Screenshot 2025-01-14 at 16.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/010884e3-8123-9fcb-601b-c605f3f8c522.png)

***ここまで長い道のりでしたが、自分で技術検証の課題を設定し、それを解決できたことで大きな達成感を得られました！***

## まとめ
最後までお読みいただきありがとうございました。***今回は、過去の技術検証を組み合わせた内容でしたが、無事に最後までやり遂げることができ、ほっとしています。***

:::note info
**最近は、自分でも少し難しい課題を設定しながら技術検証を進めていますが、その分、着実に力がついていると感じています。**
:::

今後は、これに GitHub Actions を組み合わせて、低コストで楽しめるCI/CD環境の構築を目指していきたいです！

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