VPC エンドポイント経由で SNS が実行できるようになりました!

記事タイトルとURLをコピーする

はじめに

AWS PrivateLink が遂に SNS をサポートしました!

Securing messages published to Amazon SNS with AWS PrivateLink


これまでは Private サブネットの Lambda から処理の結果を SNS で送りたいときなどはわざわざ NAT やプロキシを経由してインターネット経由で SNS の API をコールしなければなりませんでした。
しかし、今回 PrivateLink が SNS をサポートしたことで NAT 等がなくても Lambda から SNS でメールを送信できるようになりました!

試してみる

ということで、早速試していこうとおもいます。
今回は以下のような構成を作成して、 Private サブネットにいる Lambda から SNS で自分宛にメールが届くのか検証します。

準備

SNS トピックの作成

テスト用の SNS トピックを作成しサブスクリプションとして任意のメールアドレスを登録しておきます。

エンドポイントの作成

マネジメントコンソールの VPC からエンドポイントを選び「エンドポイントの作成」ボタンをクリックすると、

確かに、今までなかった com.amazonaws.ap-northeast-1.sns の文字が!


これを選び Lambda をデプロイするサブネットを選択して「エンドポイントの作成」をクリックします。

ロールの作成

今回は以下ポリシーで Lambda 用のロールを作成します。

  • AmazonSNSFullAccess
  • AWSLambdaVPCAccessExecutionRole

Lambda の作成

Lambda を新規作成します。 ランタイムには Python 3.6 で、作成したロールを選びます。

import boto3
import logging

logger = logging.getLogger()
logger.setLevel(getattr(logging,'INFO'))

sns = boto3.client('sns')

def lambda_handler(event, context):
    topicarn = 'arn:aws:sns:ap-northeast-1:000000000000:sns-endpoint-topic'
    
    sns.publish(
        TopicArn=topicarn,
        Subject='This is test subject via endpoint',
        Message='This is test message via endpoint!',
    )

エンドポイントがないとどうなるのか

まずは VPC エンドポイント(SNS)を作成していない Private サブネットにこの Lambda をデプロイし実行するとどうなるのかみてみましょう。

インターネットにつながっていないため sns.ap-northeast-1.amazonaws.com へ接続できずに処理がタイムアウトとなってしまいます。

エンドポイントがある場合

作成した Lambda ファンクションをエンドポイント作成時に選択したサブネットにデプロイし、実行した結果が以下です。

以下のようにエンドポイント経由でメール送信に成功しています!

まとめ

今回エンドポイント経由で SNS を利用できるようになったことで SNS をトリガとした Lambda の実行などプライベート環境でできることの幅はグンと広がったのではないのでしょうか。
個人的にはかなり嬉しい機能拡張なので、今後どんどん利用していきたいと思います!