【ITの話】AWSでLambda失敗時にSNSでメール送信に苦労した話

僕はSEですが、プログラミングは出来ません。トラブル時に読むことはできるくらいです。
そんな僕ですが、自分でLambdaプログラムをちょっとだけ書く必要がありました。
その際に、Lambda失敗時にトレースログをSNSで自分宛に送信したかったのですが、これに苦労したので備忘です。AWSの資格(AWS Certified Solutions Architect)を取得していてよかったなと感じました。

やりたかったこと

単なるテストなので、簡単な以下流れを試していました。

  1. API Gateway経由でLambdaをキックする
  2. API GatewayにはJSONでパラメータを渡す
  3. Lambdaがパラメータを受け取って、RDS(Oracle)からSELECTした値を返す
  4. LambdaはVPCをアタッチする
  5. 失敗したらSNSで自分宛にメールを送信する
  6. 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の外にあるからか!とすぐに気づけました。初めから気づけよって話ですが・・

コメント

タイトルとURLをコピーしました