僕はSEですが、プログラミングは出来ません。トラブル時に読むことはできるくらいです。
そんな僕ですが、自分でLambdaプログラムをちょっとだけ書く必要がありました。
その際に、Lambda失敗時にトレースログをSNSで自分宛に送信したかったのですが、これに苦労したので備忘です。AWSの資格(AWS Certified Solutions Architect)を取得していてよかったなと感じました。
やりたかったこと
単なるテストなので、簡単な以下流れを試していました。
- API Gateway経由でLambdaをキックする
- API GatewayにはJSONでパラメータを渡す
- Lambdaがパラメータを受け取って、RDS(Oracle)からSELECTした値を返す
- LambdaはVPCをアタッチする
- 失敗したらSNSで自分宛にメールを送信する
- SNSのARNはLambdaの環境変数に設定しておく
ハマった部分
Lambdaが失敗した際に、メールが届きませんでした。CloudWatch Logsにも特にログが残らず、困っていました。SNSでトピックとサブスクリプションは作っていたのですが、なんでだろうと。
解決に向けて
Lambdaのタイムアウト時間がデフォルトで15秒になっていたのですが、これを60秒に変更すると、ちゃんとしたエラーがCloudWatch Logsに残るようになりました。
こんな感じのエラーです。
com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to sns.ap-northeast-1.amazonaws.com:443 [ap-northeast-1.amazonaws.com/○○○.○○.○○.○○] failed: connect timed out
これでようやくメールが届かない理由がわかりました。SNSへアクセスできていなかったんですね。
解決策
VPCエンドポイントを作成し、SNSへのアクセスを追加しました。これでVPCエンドポイント経由でSNSへ接続でき、メールも届くようになりました。
AWSの資格試験の勉強をしていると、VPCは必ず出てきて、リージョンサービスとかゲートウェイとか出てきますよね。ここら辺の概念を少し理解していると、あーSNSがVPCの外にあるからか!とすぐに気づけました。初めから気づけよって話ですが・・
コメント