サーバレス環境構築（APIGateway+Lambda）

# はじめに
Cloudfront + S3 + APIGateway + Lambda を使い、初めてサーバレス環境を構築しました。
自身の備忘録として記述しますが、どなたかのお役に立てたら光栄です。
（不足が多々あるかと思いますがご容赦ください！）

※本記事は以下の「サーバレス環境構築（CloudFront＋S3）」に続く作業となります。
　https://qiita.com/mtsunezawa/private/4c1cdfa8f569d5523d2b

## 構成について
* CloudFront Functions を利用し、特定のIPアドレスのみアクセスを許可
* 静的コンテンツは S3 Bucket へ保存
* 動的コンテンツは API Gateway を利用
* Lambdaはデフォルトの"Hello Lambda" を利用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/e9a9c9fd-e76d-2a29-4536-1cb22371f9de.jpeg" width=100%>

今回は、APIGatewayとLambda関数を構築したいと思います。

## 環境構築

### ①Lambda構築
* Lambdaへ遷移後「関数の作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/fae202bf-c6ff-bc23-5392-8ece9b79f373.png)

* 「関数の作成」画面となるので、以下を設定。その他の項目についてはデフォルトままとする。
・「一から作成」を選択
・関数名： ※任意の関数名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/57a7e166-9240-1802-886d-717482f2571a.png)

* 関数が正常に作成された後、index.mjsの内容を修正します。
　※ 'Hello from Lambda!' を'Hello from Lambda-**AAA**!' に修正しています。
```index.mjs 修正後
export const handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda-AAA!'),
  };
  return response;
};
```
* 変更後、「Deploy」をクリックする。
※以下はDeployクリック後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/09a9bdc1-5a17-1c64-2434-67dda458556e.png)
以上でLambda-Aの構築は完了です。
同様にLambda-Bを構築し、Lambdaの構築は完了となります。
（手順は上記を読み替えてください。）
### ②APIGateway の構築
* APIGatewayへ移動し「API」を選択します。
APIタイプは「REST API」とし構築をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/eddd13e1-d5af-9335-8b72-0d9b8a1cd818.png)
* 作成画面が表示されるので以下を選択
・REST
・新しいAPI
・API名： ※任意の名称
・説明： ※任意
・エンドポイントタイプ：リージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/7aea0e9d-f5cf-a84f-ba33-14c66b50c455.png)
* 作成後、リソースやステージを作成します。
リソースを表示させ、アクション → リソースの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/bfbda910-1748-3117-4b59-b4307c34bf41.png)
* 新しい子リリースのページが開くので以下を入力し「リソースの作成」をクリックします。
・リソース名： ※任意（本記事ではLambda-Aとしています）
・リソースパス： ※任意（本記事では自動入力された値をそのまま利用します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/45ec0100-71fc-45d9-3102-d9d4b338aa13.png)
* lambda-aリソースが作成されます。
「lambda-a」をクリックし、アクション → メソッドの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/f7eb26be-b5a2-3ce0-539e-b2d8cf26ed8a.png)
「lambda-a」の下にプルダウンが表示されるので「GET」を選択し、横のチェックマークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/ad01c46f-4591-6fc4-7a46-25075c388019.png)
* セットアップ画面が表示されるので、以下を入力し「保存」をクリックします。
・統合タイプ：Lambda関数
・Lambdaプロキシ統合の利用：チェックしない
・Lambdaリージョン：ap-northeast-1
・Lambda関数：lambda-A （※←は上記で作成したLambda関数名を指定）
・デフォルトタイムアウトの使用：チェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/3004398d-0c28-47ee-5901-671ddac14f48.png)
保存をクリックすると、以下のような権限追加の確認が表示されるので、OKをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/a463b198-e157-2bf0-f535-8d52a834cb88.png)
作成されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/c78322db-22d6-09c3-d063-f3bf8e6d733c.png)
以上で「lambda-a」用のリソースが作成できました。
同様の手順でlambda-b用のリソースも準備してください。
（手順は上記を参考に作成してください）
lambda-b作成後は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/b27a7577-2c28-d746-e476-44c90d749f1e.png)
* 次に「APIのデプロイ」を実施します。
リソースのアクションから「APIのデプロイ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/304425b2-5939-827b-d217-7abcfede47d3.png)
* APIのデプロイ画面が表示されるので、以下を入力し「デプロイ」をクリックします。
・デプロイされるステージ：「新しいステージ」を選択
・ステージ名： ※任意（今回はtestを設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/4203240b-50e9-a776-ffa5-a3c06e21f7ad.png)
ステージが作成され「URLの呼び出し」が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/7186b364-879b-fdbc-742f-75af742c9f38.png)
このURLに上記でリソースとして作成した「/lambda-a」を付け加えてアクセスしてみます。
Lambda-A作成時に設定した「Hello from Lambda-AAA!」が返ってきているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/c36e5da0-3a6b-8112-06b4-e4fb9e01ad45.png)
lambda-bも同様に「Hello from Lambda-BBB!」が返ってくるはずなので確認してください。
以上でAPIGatewayとLambdaが連携するようの構築は完了となります。


次回以降でCloudFrontとAPIGatewayの連携を設定したいと思います。