VPC内のLambdaからSNSを利用してSMS/メールを送信すると、タイムアウトしてしまう

0

お世話になります。 LambdaとSNSを利用したSMS/電子メールの送信について、お知恵をお貸しくださいますでしょうか。

現在、タイトルにあります通り、VPCのパブリックサブネット内に配置したLambdaから、SNSとboto3を用いてSMSか電子メールを送信しようとしております。 Pythonでの処理はSNSのパブリッシュまで到達していることを確認しているのですが、そのパブリッシュの行でタイムアウトとなります。 スタックオーバーフローなどの過去の質疑を参考に、Lambdaのメモリを512MBに上げタイムアウト上限を60秒にしたのですが、それでも約60秒後に必ずタイムアウトとなりSMS/メールを送信することができません。

以下、当該部分のPythonのソースコードです。

# メール送信テスト
try:
    Sns = boto3.client('sns')
    
    Sns.publish(
        TopicArn='arn:aws:sns:ap-northeast-1:---:---',
        Subject='Test Mail',
        Message='This is test message.',
    )
    
    # 電話番号に認証番号を送る
    NewTelNumber = '+8190--------'
    
    Response = Sns.publish(
        PhoneNumber=NewTelNumber,
        Message='メッセージだよ'
    )
except Exception as e:
    print(f'e = {e}')

まずAndroidアプリからLambdaへリクエストが送信され、LambdaがSNSを利用し私の携帯電話へSMSかメールを送る、という流れになります。 他にもLambdaからS3も参照しておりますが、そちらは問題なく画像ファイルの取得や登録ができております。 また以下のサイトより、SNS用エンドポイントを利用すればNATゲートウェイは必要ないと読めましたので、NATゲートウェイに関しては作成しておりません。

■SNSの利用にあたり、以下のサイトを参照しております。 ・https://blog.serverworks.co.jp/tech/2018/04/12/vpc-endpoint-sns/https://bunsugi.com/aws-sns-email-sms-from-lambda/#iam-%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9Ahttps://akpolatcem.medium.com/aws-lambda-sending-sms-using-python-632ffab3d6cf など

■行った手順の概要は以下となります。 ・トピックの作成 ・SMS用と電子メール用のサブスクリプションの作成 ・SNS用のエンドポイントの作成 ・SMS/メール送信のためのPythonコードの追加

■以下について確認済みです。 ・サブスクリプションの作成の際、エンドポイントとして登録した自分自身のアドレスと電話番号へメールとSMSが届くこと。 ・登録した電話番号やメールアドレス以外へ配信するための申請はまだ行っていない。 ・AWSコンソール「Amazon SNS」→「トピック」画面→「メッセージの発行」ボタンから、登録した自分自身のアドレスと電話番号へメールとSMSが届くこと。 ・作成したエンドポイントのサービス名は「com.amazonaws.ap-northeast-1.sns」 ・作成したエンドポイントはパブリックなサブネットに関連付けられている。 ・アウトバウンドルールは、全てのトラフィック、すべてのプロトコル、全てのポート範囲を許可している。Lambdaは、そのセキュリティグループを持つVPCと関連付けられている。 ・Lambdaに関連付けられたロールには「AmazonSNSFullAccess」ポリシーが含まれている。

各設定に関して不足がある場合、ご指摘いただければ出せる範囲で追加いたします。

■気になる点 関連があるのかは不明なのですが、エンドポイントと関連付けられているパブリックなサブネットのルートのターゲットの中に、作成したエンドポイントのエンドポイントIDが含まれていません。 これが原因なのかと思い、「VPC→ルートテーブル→対象のサブネットを選択→"ルート"タブ→"ルートを編集"ボタン→"ルートを追加"ボタン」から、送信先を「0.0.0.0/0」、ターゲットに作成したエンドポイントのID(vpce-から始まるID)を入力して保存しようとしたところ、「The vpcEndpoint ID 'vpce------' does not exist」というメッセージが表示されルートを変更できませんでした。 こちらは関係ありますでしょうか。

LambdaからSMS/メールを送信するには、どこを確認すればよいでしょうか。 以上、何卒よろしくお願いいたします。

1回答
0
承認された回答

おそらくインターフェース型のSNS VPCエンドポイントを作成していると思いますが、VPCエンドポイントのセキュリティグループでLambdaのセキュリティグループからの接続を許可するように設定していますでしょうか?
具体的には以下のようなセキュリティグループの設定がVPCエンドポイントに必要です。

タイププロトコルポート範囲ソース
HTTPSTCP443LambdaのセキュリティグループID もしくは VPCのCIDR

インターフェース型VPCエンドポイントを使用する前提条件は以下のドキュメントに記載されていますのでご確認ください。
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/create-interface-endpoint.html#prerequisites-interface-endpoints

送信先を「0.0.0.0/0」、ターゲットに作成したエンドポイントのID(vpce-から始まるID)を入力して保存しようとしたところ、「The vpcEndpoint ID 'vpce------' does not exist」というメッセージが表示されルートを変更できませんでした。 こちらは関係ありますでしょうか

インターフェース型のVPCエンドポイントを使用する場合はルートテーブルの設定は不要です。

profile picture
エキスパート
回答済み 4ヶ月前
  • 小林様

    ご回答誠にありがとうございます。

    ご回答に従い、VPCに紐づけられたセキュリティグループのインバウンドルールに 「タイプ:HTTPS プロトコル:TCP ポート範囲:443 ソース:当該セキュリティグループ」 を追加したところ、私の携帯電話とメールアドレスにメッセージが届きました。 ご指摘の通り、Lambdaのセキュリティグループから接続できなかったものと思われます。 本当にありがとうございます。

    また、インタフェース型VPCについても補足いただき、誠にありがとうございます。 こちら参照し、さらに理解を深めたいと存じます。

    ご回答いただき、ありがとうございました。

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン