AWS Lambda/SNSを連携し、メール通知を行ってみる[01]

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はAWS LambdaとSNS(Simple Notification Service)を使ってメール通知機能を実装してみたいと思います。

# 最終的に構築するイメージ
何回かに分けて、以下の環境をつくっていきたいと考えております。
Cloud9で作ったDjango環境でS3にアップロードするようなWebページを作成。
ユーザはそれを使ってS3にデータをアップロードすると、S3がイベント通知をSQSに行い、SQSがLambdaをキック。LambdaがSNSを呼び出して登録したメールアドレスにメールを送付します。
![aws-django01-ページ6.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/426843a2-5d28-7283-96dc-22fb1cbe3e34.png)

この記事ではLambdaとSNSだけ環境を構築していきます。

全体の流れは以下にまとめています。

https://qiita.com/ohtsuka-shota/items/db74a418dabc261d9126

# 構築
## SNS
AWS管理コンソールにログインしてSNSの管理画面にアクセスします。
右にあるトピックの作成の下にある次のステップを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1f6b1349-4993-8d39-92f7-9709cd49b1cf.png)
以下の設定で作成します。タイプと名前以外はデフォルトで問題ありません。
- タイプ：スタンダード
- 名前：qiita-sns

![screencapture-ap-northeast-1-console-aws-amazon-sns-v3-home-2024-04-30-19_03_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d1544ec9-a009-0dfe-60d5-3de00a90d3b9.png)
作成後サブスクリプションを確認できるタブがありますので、それを押下しサブスクリプションの作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/24cc2cda-1a2d-beae-a35e-0610bcc9be31.png)
以下の設定で作成します。
- プロトコル：Eメール
- エンドポイント：任意のメールアドレス

![2024050103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/08c9bf82-2e3d-9584-0573-035ee0b049aa.png)
ステータスが保留中の確認となっていることがわかります。これを解消します。
![2024050104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c7bc6137-f442-d53d-e1e9-5542bcddcc8e.png)
入力したメールアドレス宛にSNSからメールが届いています。
リンクとなっているConfirm Subscriptionを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/95c66d5c-47b8-79a5-a2fc-bd8f44925b1e.png)
正常に登録が完了すると以下のような画面が表示されます。
![2024050105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/421a760d-1d34-6eca-70bb-063113bc521d.png)
ステータスが確認済みになります。
SNSの設定は以上です。
![2024050106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/65ac1b89-2305-04e8-4c6f-d49440479919.png)


## Lambda
Lambdaを作っていきます。関数の管理を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f4788a0a-eaee-7833-189d-688a52f5e0a5.png)
関数の作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a4b035ac-6d12-75bc-a272-1cd67d79dcb9.png)
以下の設定で作成します。
- 一から作成
- 関数名：qiita_lambda
- ランタイム：Python 3.12
- 実行ロール：基本的なLambdaアクセス権限で新しいロールを作成

![screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2024-04-30-19_13_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/86c3e0af-cfb9-360d-1959-ef01dc2a94e2.png)
以下のような画面が表示されます。
Lambdaアイコンの右に表示されている送信先を追加を押下します。
![2024050108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b41df98f-a481-8bf3-6bba-e731717b6ade.png)
以下の設定で保存します。
必要なアクセス許可を追加にチェックがついていることを確認します。
恐らくこれにチェックを入れることでIAM roleにSNSへの権限がアタッチされるのかなと。。。
- ソース：非同期呼び出し
- 条件：正常
- 送信先タイプ：SNSトピック
- 送信先：qiita-sns

![2024050107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/8dbb0e55-cf22-c969-4faa-057bf923ba9b.png)
以下のようにLambdaの右側にSNSが表示されます。
![2024050109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/53e863e8-60d0-a9eb-32be-c0273d97e481.png)
このタイミングでLambdaのroleにSNSに関するものが追加されています。
アクションのところに記載されているAllow:snsPublishがあることでLambdaからSNSにメッセージ送信が可能となるようです。
リソースのところにモザイクを入れていますが、SNSのArnが表示されています。
![2024050110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2bf6fbbe-a3e2-d0c2-7384-f1e9cf372b2f.png)
Lambdaのコードを書き換えます。
デフォルトでは以下の設定となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/eefc3924-4637-28c2-5177-d8cacce216eb.png)
これを以下のように書き換えます。TopicArnは連携したいSNSのArnを持ってきてください。Subjectはメールの件名。Messageはメールの本文を示します。
```python
import boto3
client = boto3.client('sns')

def lambda_handler(event, context):
    
    params = {
    'TopicArn': '★SNSのArnをここに張り付ける★',
    'Subject': 'S3+SQS+Lambda+SNS環境を構築する',
    'Message': '色々覚えることが多くて大変だ～汗'
    }
    
    client.publish(**params)
```
変更したら上にあるDeployを押下します。
これをしないと変更が反映れません。
最初Deployをしてなくて「なんで変更されない！？」となりました（1敗）
Deployを押した後青色のTestボタンを押下します。
![2024050101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5f1f02d0-862d-f8cb-d79e-b852ad2c1ba8.png)
テストを作成する画面が表示されます。
テストの名前を適当につけて保存してください。
この後、ひとつ前の画面に自動で移動しますので改めてTestボタンを押下してください。
![Pasted image 20240430192550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/14b608bc-a33b-0711-8bbe-7bdfcf58746f.png)
メールが来ているかを確認します。
Gmailで試験をしている場合、プロモーションのところにメールが飛んできているはずです。
今回はここまで！
![2024050102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1b26e7a3-f14f-5396-3968-d9ff85198291.png)