【アップデート】AWS PrivateLink 対応で SNS がよりセキュアに使えるようになりました!

今回のアップデートで、Amazon Simple Notification Service(SNS)が AWS PrivateLink でサポートされるようになりました!

「はて、、PrivateLink ってなんだっけ・・・」
と、お忘れの方がおられましたら、まず、こちらの記事をご参照ください。

PrivateLinkがリリースし新たにEC2, Systems Manager, ELB, Kinesis, Service CatalogがVPCエンドポイントに対応しました

そうです!S3 の VPC エンドポイントなどで知られている「ゲートウェイ VPC エンドポイント(既存方式)」に加えて、各サービスのエンドポイント(または独自エンドポイント)と、Elastic Network Interface(ENI) をリンクさせることで、インターネットを介さずにセキュアなエンドポイントアクセスを実現するサービスのことでしたね。

思い出していただいたところで、早速、試していきましょう!

さっそく試す!

VPC のコンソールメニューを開き、エンドポイントの作成をクリックします。

デフォルトの状態でエンドポイントの一覧が表示されているかと思います。たしかに com.amazonaws.ap-northeast-1.sns が追加されているので、こちらを選択します。

次にエンドポイントを作成する VPC および、サブネットを選択します。
プライベート DNS 名を有効にするにチェックをいれた場合は、通常のエンドポイント名 sns.ap-northeast-1.amazonaws.com も使用可能になります。ただし、VPC 設定でDNS 解決 および DNS ホスト名 が有効になっている必要がありますので、設定される際には確認しておいてください。
さいごにエンドポイントと接続する ENI に付与するセキュリティグループを選択します。エンドポイントへの接続は HTTPS で行われますので、EC2 からの HTTPS を許可するルールを追加したものを作成 or 選択し、エンドポイントの作成を実行します。

作成されたエンドポイントを確認すると、従来のエンドポイント名や、独自のエンドポイント名が作成されていることが判ります。

VPC エンドポイントの作成は以上です。

EC2 から確認してみる!

それでは、プライベートサブネットの EC2 にログインし確認していきましょう!まずは、digコマンドでエンドポイントが属している IP アドレスを確認してみると、プライベートサブネットの IP アドレスが返ってくるはずです。

$ dig sns.ap-northeast-1.amazonaws.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.57.amzn1 <<>> sns.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38296
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;sns.ap-northeast-1.amazonaws.com. IN	A

;; ANSWER SECTION:
sns.ap-northeast-1.amazonaws.com. 60 IN	A	192.168.3.115
sns.ap-northeast-1.amazonaws.com. 60 IN	A	192.168.2.143

;; Query time: 1 msec
;; SERVER: 192.168.0.2#53(192.168.0.2)
;; WHEN: Wed Apr 11 15:03:43 2018
;; MSG SIZE  rcvd: 82

それでは実際に、sns コマンドが受け付けられるか確認してみます。事前に作成しておいた SNS トピックに、以下のようなコマンドで publish します。

$ aws sns publish --region ap-northeast-1 --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxx:cm-topic --message "test message"
{
    "MessageId": "469509df-686e-52b3-a031-5a97407f17aa"
}

"MessageId": "xxxxxxx-xxxx-xxxx〜" のような表示が返ってくれば、publish は成功です。無事にプライベートサブネットからエンドポイントにアクセス出来ることが確認できましたね!

さいごに

これまで SNS を使用するには IGW、NAT ゲートウェイ、または VPN などを経由してパブリックネットワークに出る必要がありましたが、今回のアップデートによって、AWS 環境内で完結することが可能となりました。これにより、これまで SNS で publish することが敬遠されていたようなセンシティブな情報を扱うシステムでも SNS → Lambda → DynamoDB/S3 に PUT といったような構成をとることも可能になり、アーキテクチャの幅が広がったのではないでしょか!
また、エンドポイントへのアクセス経路が変わるだけで、topic ARN は変更されませんのでコードの書き換えなどの必要もなく、お手軽にセキュリティレベルを向上させることが出来るので、既に SNS を利用されているユーザにも嬉しいアップデートになりましたね!

以上、どこかの誰かのお役に立てたならば幸いです。大阪オフィスの丸毛でした!