API GatewayとLambdaを連携させる

# 構成図
APIGateway→Lambda→SNS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/2bbc334f-32e6-af61-149a-7f5ba0e9fe4e.png)


# 前提知識
- AWS Lambda単体ではLambda関数の実行ができない。
Lambda関数を実行させるためには、他のサービスリソースで処理を起動させるきっかけとなるトリガーが必要
Lambdaを実行するトリガー
①トリガーと同期して関数を起動するタイプ
　例）API Gateway、手動実行
②イベントが発生したことを検知して非同期で関数を実行するタイプ
　例）Amazon S3、CloudWatch Log、CloudWatch Eventsからの実行

# 流れ
・SNSトピックの作成
・Lambdaの作成（SNS連携）
・LambdaのIAM設定
・API GatewayでAPIの作成
・動作確認

# SNSトピックの作成
マネジメントコンソールのSNSの画面からトピックの作成をします。
タイプはスタンダードに変更。名前を「SNS-Lambda-Test」と設定しました。
これ以下はすべてオプションなので飛ばして「トピックの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/178c0d9e-7516-81bb-156d-3119b2895c7f.png)
作成したトピックのサブスクリプションを作成します。
「サブスクリプションの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/2983f2f0-c72d-db35-9ca9-e578ee458bc2.png)
今回はEメールで通知を受け取るので、自身のGmailを登録します。詳細の設定が完了したらスクロールして「サブスクリプションの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/a7961cc8-86df-d64b-e2e3-4ead76c24c51.png)
このままではステータスが以下のように保留中になっています。設定したメールアドレスの受信メールを確認すると、「AWS Notification -Subscription Confirmation」というメールを受信しているはずなので、そこでサブスクリプションを確定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/6ea026b7-dac6-18f8-f727-357a1d3247ae.png)
その後ブラウザをリロードして再度ステータスを確認するとすぐに確認済みに変わります。これを確認できればSNSの設定は以上です。


# Lambda関数の作成
一から作成」を選択し、関数名を「SNS-Lambda-Test」に設定し、ランタイムに「Python 3.9」を選択。
その他はデフォルトのままで下までスクロールして「関数の作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/6d2aa06a-a183-ee53-178f-032c90b6ba14.png)
関数の作成ができました。これからは関数の設定を行います。以下のコードタブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/5a062ae9-9cb2-1212-d5d4-a657032763c4.png)
コードソースを以下の通りに書き換えます。TopicArnの部分は先ほど作成したSNSのARNを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/da293e92-2755-946a-cd96-75c111843f0f.png)

    import boto3
    client = boto3.client('sns')
    
    def lambda_handler(event, context):
        params = {
        'TopicArn': 'arn:aws:sns:ap-northeast-1:816394368809:SNS-Lambda-Test',
        'Subject': 'Subject Lambda(python) -> Test Mail dayo',
        'Message': 'Message\n\nLambda -> Hi!\n Have a good day:)'
        }
        
        client.publish(**params)
変更後、Deployをクリック。「関数 SNS-Lambda-Test が正常に更新されました。」の表記を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/340cf16d-bf3e-3389-95b7-0baa4377ecfc.png)

# LambdaのIAM設定
IAMポリシーを開き、「ポリシーを作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/57093ee9-790f-f26e-e9c7-a452907804a2.png)
以下の通り、サービスをSNS・アクションを書き込み＞Publish・リソースはすべてのリソースで設定し、下にスクロールして「次のステップ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/34d6e925-ab69-8427-7df9-c7b9e2459472.png)
今回はタグを設定せず「次のステップ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/3968a812-1289-ed2f-16d5-d09eae2e5f0b.png)
名前を設定して下にスクロールして「ポリシーの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/80b3a25f-6474-08c2-f00b-8b97e317ca39.png)

次にLambdaの画面に戻り、設定＞アクセス権限＞ロール名の青文字をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/3fc70a92-c385-2261-4626-cb02826a5bee.png)
ロールの画面に遷移するので、「許可を追加」をクリックし、「ポリシーをアタッチ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/9ef0ab37-d99f-34fb-304f-51ebe882c5f5.png)
先ほど作成したポリシーにチェックをつけて下までスクロール。「ポリシーをアタッチ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/8271a449-fd2a-b2bc-f73a-f82d777ccda5.png)
ポリシーがアタッチされていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/357d0577-02d7-b00f-ab2b-4740f89947a7.png)
ポリシーの設定は以上です。

# Lambdaのテスト
Lambdaの画面に戻り、「Test」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/d2d5d752-1db7-c4af-8a1a-a10f2f12aa6a.png)
以下のようにテストイベントを設定し、下までスクロールして「保存」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/b90d7493-68e5-7eaf-0eb9-8385f4948a43.png)

以下のような結果が表示され、メールを受信できればテスト成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/6370c52f-eff4-3329-2082-906f996fbf0d.png)
Lambdaの設定は以上です。
# APIGatewayでAPIの作成
APIの画面に移動して、API作成をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/e3bbbc70-0651-004b-0b21-157a7a4681e5.png)
RESTAPIの「構築」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/0f22cd25-3a86-479b-2e97-1d6509b76596.png)
「APIの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/9374a65e-d31c-ba0d-a45d-a6d82f7269c8.png)
「リソースの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/ddb20b66-ac72-e21b-2d55-b04b13bdb0c1.png)
リソース名を入力して「リソースの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/7ba4cd80-218d-5706-540b-d6ecc64e30c8.png)
そのリソースを選択した状態で「アクション」＞「メソッドの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/b5bb4b27-f436-27f1-21dd-7b4e34768d53.png)
プルダウンからGETを選択してチェックマークをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/6801205f-72e7-4d4a-d9fb-876d110c6e57.png)
総合タイプをLambda関数にし、Lambda関数の欄に先ほど作成したLambda関数名を入力。「保存」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/28c77589-f869-e211-3652-95787e95f255.png)
「OK」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/46bafe1b-2670-e93a-48eb-e231b278b65b.png)
以下のページに遷移するので、中央あたりにある「テスト」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/41cb9be7-7279-2f93-02ea-c28f3dcf221f.png)
何も入力せずに再度「テスト」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/433fbf16-cbc3-63a6-29b2-f1b2ba5f1315.png)
右側にテスト結果が表示されます。
ステータス:200であり、メールを受信することができたので、テスト成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/a209c829-dc6c-8a7d-8896-c46d367056f9.png)
アクション＞APIのデプロイをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/54843247-ebe6-49f0-6ce2-cdfbc41cb51e.png)
デプロイの詳細を設定。今回はdevステージにデプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/a42fb448-0c51-e752-d504-12f963055bc5.png)
デプロイするとこの画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/d398a494-5ecc-fb08-325c-c7d0c4b7d07f.png)
URLの呼び出し:https://~~のURLにリクエストを投げるとLambdaで処理して返してくれるのですが、注意点があります。今回作成したGETのリクエストを投げるには、このURLではなく、ステージの下にあるdevを展開したGETページで表示されるURLが必要です。このGETページのURLを動作確認で使用するためにメモしておきます。
設定は以上で終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/1d103935-6878-9e8d-54b6-c9b35f0a7b42.png)

# 動作確認
コマンドプロンプトを開き、以下のコマンドを実行。
https://　のURLは作成したAPIのステージのページで確認した「URLの呼び出し」のものを入力。

    curl https://xxxxxxxxxxxxxxxxx
nullと返ってきて、無事メールを受信することができました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989225/1774f069-15cb-4159-ef6e-b2143e51f283.png)