LambdaとAPI Gatewayの作り方メモ

# はじめに
SAA取得後、業務ではほぼAWSを触ったことがありませんでしたが、今回初めてサーバレス環境をハンズオンで構築しました。アウトプットが大事！ということで、サービスの設定方法についてを備忘録代わりに記載しようと思います。
まずは手始めに、Lambdaの作成とAPI Gatewayの設定というところを記載します。

:::note info
やりたいこと
- 1からLambdaを設定する。
- 作成したLambdaをAPI Gatewayに設定する。
- Qiitaの記載は初めてなので、Markdown形式の記載方法に慣れる。
- アウトプットすることで各サービスの理解力を高める。
:::

# Lambda
サーバーレスのシステムを構築する際には避けては通れないサービス。
ただし、実際にLambdaを作成したのは今回がほぼ初めてなので、作成方法やら設定値やらについてを以下に記載します。

## Lambdaの作成
1. コンソールの検索ボックスに「Lambda」を入力すれば、サービスに表示されるのでそちらをクリック。
![1-1.Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/daf4446f-7465-bb6a-7e00-a542eabcf2f2.png)
2. 右上に「関数の作成」ボタンがあるので、そちらをクリック。
3. 関数の作成画面が表示されるので、関数名やランタイム、実行ロールを選択して、「関数の作成」ボタンをクリック。
![1-2.Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/3d0dca4e-fa50-a0d8-752f-4445ee0f7155.png)



    |No.| 設定項目 | 値 |
    | ---- | ---- | ---- |
    |1| 関数の名前 |Lambdaの名称 |
    |2| ランタイム |動かしたいLambdaのプログラム言語 |
    |3| アクセス権限 |Lambdaからアクセスするサービスの権限ロール|

4. Lambdaの関数一覧に作成したLambdaが表示される。

## 【メモ】Lambdaの設定方法について
今回Lambdaを作成した際に設定した項目について以下にメモします。

### 1.一般設定
主にメモリやタイムアウト、Lambda実行時の実行権限などのその名の通り、Lambda自体の設定変更が行える。
基本は初期に作成した際に設定が行える項目だが、メモリのサイズを上げたいなどがあればこちらから設定変更が行える。
1. 設定タブを選択し、一般設定の編集ボタンを押下する。
2. 表示される画面でメモリ、タイムアウト、実行ロールの変更が行える。
![1-3.Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/2ea00461-d6c3-5359-daba-b3ae565f6813.png)

### 2.環境変数
Lambdaで設定したプログラム内で使用する固定値をこちらで設定することができる。
基本的にLambdaのプログラム内で固定値を記載するぐらいならこちらで一括管理したほうがよさそう。
各Lambda関数ごとに設定する必要があるので、注意する。
1. 設定タブを選択し、環境変数の編集ボタンを押下する。
2. 表示される画面キー名と値を入力して、Lambdaで実行されるプログラムで使用する固定値の設定が可能。
![1-4.Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/2fa2589a-939c-5e79-2ebd-afe88090ba2b.png)

### 3.レイヤー
Lambdaで使用したい共通機能的なものを読み込むことができる。例えば、各Lambdaの関数内で使用するビジネスロジックなどの複数のLambda関数内で使用したい処理などをあらかじめ、カスタムレイヤーとしてまとめて設定しておいて、レイヤーとして呼び出すことで、同じ処理を各Lambdaのプログラム内で実行することが可能になる。
カスタムレイヤーとして追加したいものについてはあらかじめ、レイヤーの作成から追加する必要がある。
Lambda作成時と同じようにzipファイルとしてアップロードすることが可能。

1. 関数の概要に表示されているLambda関数名の下に「Layers」とあるのでそこをクリックする。
2. スクロールが画面下部に移動し、「レイヤーの追加」ボタンがあるのでそこをクリックする。
3. レイヤーソースとAWSレイヤーを選択し、「追加」ボタンをクリックする。
![1-5.Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/56f4d4ed-1199-4cd4-4f51-6ba9ab073789.png)

# API Gateway
個人的にはSAA取得時に試験に出てたところでイマイチイメージがわかなかったサービスになります。
いざ、作成してみると意外と設定画面がわかりづらいように感じました。
## API Gatewayの作成
1. コンソールの検索ボックスに「API」を入力すれば、サービスに表示されるのでそちらをクリックする。
![2-1.ApiGateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/cfd0cabb-abfc-8d71-6f85-ed02352b02b2.png)
2. 右上の「API」を作成ボタンがあるのでそこをクリックする。
3. APIタイプの選択画面が表示されるので、任意のAPIタイプのところで「構築」ボタンをクリックする。以下のAPIタイプを選択することが可能。
    > HTTP API
    > WebSocket API
    > REST API
    > REST API プライベート
4. プロトコルの選択画面で「API名」と「エンドポイントタイプ」を入力・選択し、「APIの作成」ボタンをクリック。

## リソースの作成
上記の手順でいったんAPI作成後、それに対してリソースやらメソッドの作成を行う。

1. アクションリストから作成したいAPIの階層に合わせて、リソースの作成を行う。
![2-2.ApiGateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/a6cecc13-0731-cacd-02f7-dfa313efd325.png)
2. アクションリストからメソッドの作成を行う。
「POST」,「GET」を選択できるので選択する。
3. メソッドの統合タイプ、Lambda関数を入力する画面が表示されるので、呼び出したいLambdaの関数を入力し、保存ボタンをクリック。
4. メソッドが作成され、「メソッドリクエスト」、「統合リクエスト」、「メソッドレスポンス」、「統合レスポンス」の変更が可能な画面が表示される。
5. マッピングテンプレートを使用する場合は、「統合リクエスト」、「統合レスポンス」で設定を行う。
6. APIのデプロイをアクションリストから実施する。

### 1. メソッドリクエスト
 > リクエストのパラメータや認証、必須となるヘッダやAPIキーなどを定義する。
### 2. 統合リクエスト
> リクエストに関する設定の定義を行う。
>「Lambda関数」,「HTTP」,「Mock」などの統合タイプやマッピングテンプレートによるリクエストの変換ルール。
### 3. 統合レスポンス
> レスポンスに関する設定の定義を行う。ステータスコードやヘッダ。マッピングテンプレートの変換ルール。
### 4. メソッドレスポンス
> HTTPステータスコードやコンテンツタイプなどのAPI Gatewayから返却されるレスポンスの設定の定義を行う。

## 【メモ】API Gatewayの設定について

### 1.CORSの有効化
うろ覚えですが、CORSとは別のオリジン(異なるプロトコル、ドメイン、ポート)からのアクセスを許可するかどうかという設定。作成したリソースの値を置き換えることになるので、手順としてはリソースとメソッドの作成後に行う。
1. アクションリストから「CORSの有効化」を選択する。
2. CORSの有効化画面で「CORSを有効にして既存のCORSヘッダーを置換」ボタンをクリック。
3. メソッド変更の確認ダイアログが表示されるので、「はい、既存の値を置き換えます」ボタンをクリック。
4. 既存の値が置き換えられ、なければ新たに「OPTIONS」メソッドが追加される。


# おわりに
Lambdaの作成自体はそこまで苦も無く設定できたと思いますが、API Gatewayの設定方法がちょっと難しいと感じました。
今回は一部のLambdaをAPI Gatewayに設定したのですが、「GET」などのパラメータの取り方や、マッピングテンプレートの記載方法、デプロイ時のステージについてなどやっていないことがまだまだある認識です。
どこかで、それらの設定方法についてもまとめたいなとは考えています。
あと、Qiitaの記載方法についてももう少し工夫できればと考えています。他の方の書いている記事はとても見やすく記載されているものが多く、今度記事を書く際は参考にしたいところです。