最近、仕事でLambdaからSNSを使用して、Eメール送信する機能を開発する機会がありました。
Nodeを使って開発し、コード自体はググればコピペして使えるコードが盛りだくさんだったので、直ぐに終わるかと思ったのですが・・・
とにかくSNSへのメッセージ発行ができず、苦労しました。
調査した結果、メッセージ発行ができない原因が3つあったので、メモとしてまとめようと思います!
その1、権限がない
こちらは、どのサイトでも大体書かれていました。
Lambadaの実行ロールにSNS実行権限を付ける必要があります。
設定タブのアクセス権限から実行ロールを編集可能です。
その2、エンドポイントが無い
サイトで紹介されるサンプルだと、ネットワークの利用を特にしないので、忘れがちです。
実際はプライベートなVPCネットワーク内にLambdaを配置していると思うので、SNSに繋ぐためのエンドポイントが必要になります。
現場だと、ここにVPCの設定があるはず。(無ければエンドポイントは必要ない)
その3、実行ロールよりIAMユーザーが優先される
ここで、大分ハマりました。
その1で実行ロールにはSNSの権限を付けたのに権限が無いというエラーが消えませんでした。
調査した結果、以下のようにコード上でIAMユーザーのアクセス設定をしていると、こちらが優先されます。
var sns = new AWS.SNS({
accessKeyId: '<access_key>',
secretAccessKey: '<secret_key>'
});
Lambdaの実行ロールを使いたい場合は、上記のようにアクセスキーの設定は不要です!
終わりに
職場でなかなか解決できず焦りました^^;
しかし、そのお陰で曖昧だったVPC・IAMの知識が深まったので、得られたものも多かったです!
やっぱり実際に触って何かを作ることでしか、IT知識って身にならないんだな〜と感じました。
参考
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/sns-examples-publishing-messages.html
https://blog.fire-sign.info/1157/
https://hacknote.jp/archives/13102/
https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-vpc-tutorial.html
https://blog.serverworks.co.jp/tech/2018/04/12/vpc-endpoint-sns/