プライベートサブネットのEC2からSNSを使ってみる

プライベートサブネットにあるインターネットに繋がらないEC2からAmazon SNSにメッセージを送ってみたので紹介します。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ニシヤマです。はいマスキュラー。

プライベートサブネットにあるEC2からVPC Endpoint経由でSNSにメッセージを送信してみたので紹介します。

イメージ

最初に構成は以下のようになります。

SNSへアクセスするサーバAへは踏み台サーバ経由でログインします。

前提

  • イメージ図のVPC、EC2が構築済みであること
  • サーバAにboto3がインストール済みであること

環境

今回試してみた環境は以下です。

  • Amazon Linux release 2 (Karoo)
  • Python 2.7.14
  • boto3 1.9.127

やってみる

SNSトピックの作成

マネジメントコンソールからメッセージ送信先になるSNSトピックを作成します。

サブスクリプションにはプロトコル「Eメール」を選択し適当なメールアドレスを登録し、受信したメールのリンクから承認しておきます。

VPCエンドポイントの作成

次にVPCにエンドポイントを作成します。サービスカテゴリはAWSサービス、サービス名をcom.amazonaws.ap-northeast-1.snsを選択します。次にエンドポイントを使用するVPC、サブネットを選択し、セキュリティグループを選択します。

セキュリティグループのルールはInboundでプライベートサブネットのEC2にアタッチしたセキュリティグループからHTTPS(443番)を許可します。

EC2にIAMロールのアタッチ

IAMの画面でポリシー「AmazonSNSFullAccess」をアタッチしたIAMロールを作成し、プライベートサブネットにあるサーバAにアタッチします。

 

EC2にプログラムの配置

踏み台サーバ経由でサーバAにSSHログインし、以下のスクリプトを作成します。

sns_publish.py

#! /usr/bin/python

import boto3

client = boto3.client('sns')

response = client.publish(
 TopicArn='arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:test-nishiyama',
 Subject='Test Message',
 Message='Test Message Body'
)

そのまま実行するとリージョン指定の必要があるとエラーが出るので、aws configureコマンドでデフォルトリージョンに「ap-northeast-1」を指定します。

実行してみる

サーバAで以下のコマンドでスクリプトを実行します。

python sns_publish.py

SNSトピックのサブスクリプションに設定したメールアドレスにメールが届きました!

おわりに

前職までの経験ではプライベートサブネットに配置したEC2の利用やVPCエンドポイントを利用する事がなかったので、EC2に権限があるのにサービスが使えないと言った経験をすることがありませんでしたが、今回の構成を構築する事でVPCエンドポイントでどの様なメリットがあるのかの一端を理解することができました。 また、今まではプログラムを書くということから避けてきたので苦手意識があったのですが、今回利用した簡単なスクリプトをネットの情報や公式ドキュメントを参考にしながら書いてみることで自分でも動くプログラムを作ることができました。今後は少しづつプログラムを書くということも学習していきたいと思います。