Amazon Simple Notification Service
開発者ガイド (API バージョン 2010-03-31)

チュートリアル: Amazon VPC から Amazon SNS メッセージをプライベートで発行する

このチュートリアルでは、プライベートネットワークでメッセージを安全に保ちながら、Amazon SNS トピックに発行する方法について説明します。Amazon Virtual Private Cloud (Amazon VPC) でホストされている Amazon EC2 インスタンスからメッセージを発行できます。メッセージは、パブリックインターネットを移動せずに AWS ネットワーク内に留まります。VPC からプライベートにメッセージを発行することにより、アプリケーションと Amazon SNS 間のトラフィックのセキュリティを強化できます。このセキュリティは、顧客に関する個人を特定できる情報 (PII) を公開する場合や、アプリケーションが市場規制の対象となる場合に重要になります。たとえば、プライベートな発行は、Health Insurance Portability and Accountability Act (HIPAA) に準拠する必要があるヘルスケアシステムや、Payment Card Industry Data Security Standard (PCI DSS) に準拠する必要がある財務システムがある場合に役立ちます。

このチュートリアルを完了するには、以下のことが必要です。

  • AWS CloudFormation テンプレートを使用して、AWS アカウントの一時的なプライベートネットワークを自動的に作成します。

  • VPC を Amazon SNS に接続する VPC エンドポイントを作成します。

  • Amazon EC2 インスタンスにログインし、Amazon SNS トピックにメッセージをプライベートで発行します。

  • メッセージが正常に配信されたことを確認します。

  • このチュートリアル用に作成したリソースを削除し、AWS アカウントに残らないようにします。

次の図は、このチュートリアルを完了する際に AWS アカウントで作成するプライベートネットワークを示しています。


	                このチュートリアルで作成するプライベートネットワークのアーキテクチャー。

このネットワークは、Amazon EC2 インスタンスを含む VPC で構成されます。インスタンスはインターフェイス VPC エンドポイントを介して Amazon SNS に接続します。このタイプのエンドポイントは、AWSPrivateLink を使用するサービスに接続します。この接続が確立されたら、ネットワークがパブリックインターネットから切断されている場合でも、Amazon EC2 インスタンスにログインして Amazon SNS トピックにメッセージを発行できます。このトピックは、受け取ったメッセージを、2 つの AWS Lambda サブスクライブ関数にファンアウトします。これらの関数は、受け取ったメッセージを Amazon CloudWatch Logs に記録します。

このチュートリアルの完了には 20 分ほどかかります。

開始する前に

このチュートリアルを開始する前に、Amazon Web Services (AWS) アカウントが必要です。サインアップすると、Amazon SNS、Amazon VPC など AWS のすべてのサービスに対してお客様のアカウントが自動的にサインアップされます。AWS アカウントをまだ作成していない場合は、 に移動し、[まずは無料で始める] を選択します。

ステップ 1: Amazon EC2 キーペアの作成

Amazon EC2 インスタンスへのログインには、キーペアが使用されます。これは、ログイン情報の暗号化に使用されるパブリックキーと、その復号に使用されるプライベートキーで構成されます。キーペアを作成するときは、プライベートキーのコピーをダウンロードします。このチュートリアルでは、キーペアを使用して Amazon EC2 インスタンスにログインします。ログインするには、キーペアの名前を指定し、プライベートキーを指定します。

キーペアを作成するには

  1. AWS マネジメントコンソールにサインインをしたあと、https://console.aws.amazon.com/ec2/ にある Amazon EC2 コンソールを開きます。

  2. 左のナビゲーションメニューで、[Network & Security (ネットワーク & セキュリティ)] セクションを見つけます。次に、[キーペア] を選択します。

  3. [Create Key Pair] を選択します。

  4. [キーペアの作成] ウィンドウで、[キーペア名] に「VPCE-Tutorial-KeyPair」と入力します。続いて、[Create] を選択します。

    
	                            [キーペアの作成] ウィンドウ。
  5. ブラウザによって秘密キーファイルが自動的にダウンロードされます。そのファイルを安全な場所に保存します。Amazon EC2 ではそのファイルの拡張子は .pem です。

  6. (オプション) Mac または Linux コンピュータで SSH クライアントを使用してインスタンスに接続している場合は、chmod コマンドを使用してプライベートキーファイルの権限を設定すると、お客様のみがそれを読み取ることができます。

    1. ターミナルを開き、プライベートキーを含むディレクトリに移動します。

      $ cd /filepath_to_private_key/
    2. 次のコマンドを入力してアクセス許可を設定します。

      $ chmod 400 VPCE-Tutorial-KeyPair.pem

ステップ 2: AWS リソースを作成する

このチュートリアルをサポートするインフラストラクチャをセットアップするには、AWS CloudFormation テンプレートを使用します。テンプレートは、Amazon EC2 インスタンスや Amazon SNS トピックなどの AWS リソースを構築するための設計図として機能するファイルです。このチュートリアルのテンプレートは GitHub で提供されていて、ダウンロードできます。

AWS CloudFormation にテンプレートを提供すると、AWS CloudFormation は AWS アカウントでスタックとして必要なリソースをプロビジョニングします。スタックは、単一のユニットとして管理できるリソースのコレクションです。このチュートリアルを終了すると、AWS CloudFormation を使用してスタック内のすべてのリソースを一度に削除できます。これらのリソースは、希望しない限り AWS アカウントには残りません。

このチュートリアルのスタックには、次のリソースが含まれます。

  • VPC および関連するネットワーキングリソース (サブネット、セキュリティグループ、インターネットゲートウェイ、およびルートテーブルを含む)。

  • VPC 内のサブネットに起動された Amazon EC2 インスタンス。

  • Amazon SNS トピック。

  • 2 つの AWS Lambda 関数。これらの関数は、Amazon SNS トピックに発行されたメッセージを受け取り、CloudWatch Logs にイベントを記録します。

  • Amazon CloudWatch メトリクスおよびログ。

  • Amazon EC2 インスタンスに Amazon SNS の使用を許可する IAM ロール、および CloudWatch ログへの書き込みを Lambda 関数に許可する IAM ロール。

AWS リソースを作成するには

  1. GitHub ウェブサイトからテンプレート ファイルをダウンロードします。

  2. AWS CloudFormation コンソールにサインインします。

  3. [Create Stack] を選択します。

  4. [テンプレートの選択] ページで、[テンプレートを Amazon S3 にアップロード] を選択してから、ファイルを選択した後、[Next (次へ)] を選択します。

  5. [詳細の指定] ページで、スタック名とキー名を指定します。

    1. [Stack name] に VPCE-Tutorial-Stack を入力します。

    2. [KeyName] で、[VPCE-Tutorial-KeyPair] を選択します。

    3. [SSHLocation] で、デフォルト値の 0.0.0.0/0 のままにします。

      
	                                    [詳細の指定] ページ。
    4. [Next (次へ)] を選択します。

  6. [オプション] ページで、すべてのデフォルト値を受け入れ、[次へ] を選択します。

  7. [Review (確認)] ページで、スタックの詳細を確認します。

  8. [機能] で、AWS CloudFormation がカスタム名で IAM リソースを作成する可能性があることに同意するチェックボックスをオンにします。

  9. [Create (作成)] を選択します。

    AWS CloudFormation コンソールで [スタック] ページが開きます。VPCE-Tutorial-Stack のステータスは CREATE_IN_PROGRESS です。数分後に作成プロセスが完了し、ステータスが CREATE_COMPLETE に変わります。

    
	                            ステータスが CREATE_COMPLETE である AWS CloudFormation スタック。

    ヒント

    [更新] ボタンを選択して、スタックの最新のステータスを表示します。

ステップ 3: Amazon EC2 インスタンスにインターネットアクセスがないことを確認する

前のステップの VPC で起動された Amazon EC2 インスタンスにはインターネットアクセスがありません。アウトバウンドトラフィックが禁止されているため、Amazon SNS にメッセージを発行することができません。インスタンスにログインしてこれを確認します。次に、パブリックエンドポイントへの接続と、Amazon SNS へのメッセージの発行を試みます。

チュートリアルのこの時点では、発行の試みは失敗します。後のステップで、Amazon SNS の VPC エンドポイントを作成すると、発行の試みは成功します。

Amazon EC2 インスタンスに接続するには

  1. https://console.aws.amazon.com/ec2/ で Amazon EC2 コンソールを開きます。

  2. 左のナビゲーションメニューで、[インスタンス] セクションを見つけます。続いて、[インスタンス] を選択します。

  3. インスタンスの一覧で、[VPCE-Tutorial-EC2Instance] を選択します。

  4. [Public DNS (IPv4)] 列に示されたホスト名をコピーします。

    
	                            AWS CloudFormation によって起動された Amazon EC2 インスタンスに関する詳細。
  5. ターミナルを開きます。キーペアが含まれているディレクトリから、以下のコマンドを使用してインスタンスに接続します。ここで、instance-hostname は、Amazon EC2 コンソールからコピーしたホスト名です。

    $ ssh -i VPCE-Tutorial-KeyPair.pem ec2-user@instance-hostname

インスタンスがインターネットに接続されていないことを確認するには

  • ターミナルで、amazon.com など任意のパブリックエンドポイントへの接続を試します。

    $ ping amazon.com

    接続の試行が失敗するため、いつでもキャンセルできます (Windows では Ctrl + C、macOS では Command + C)。

インスタンスが Amazon SNS に接続されていないことを確認するには

  1. Amazon SNS コンソール (https://console.aws.amazon.com/sns/) を開きます。

  2. 左側のナビゲーションメニューで、[トピック] を選択します。

  3. [トピック] ページで、トピック [VPCE-Tutorial-Topic] の Amazon リソースネーム (ARN) をコピーします。

  4. ターミナルで、トピックへのメッセージを発行を試みます。

    $ aws sns publish --region aws-region --topic-arn sns-topic-arn --message "Hello"

    発行の試みが失敗するため、いつでもキャンセルできます。

ステップ 4: Amazon SNS の Amazon VPC エンドポイントを作成する

VPC を Amazon SNS に接続するには、インターフェイス VPC エンドポイントを定義します。エンドポイントを追加したら、VPC の Amazon EC2 インスタンスにログインし、そこから Amazon SNS API を使用できます。トピックにメッセージを発行でき、メッセージはプライベートに発行されます。メッセージは AWS ネットワーク内にとどまり、パブリックインターネットを移動することはありません。

インスタンスは、まだ他の AWS のサービスやインターネットのエンドポイントにアクセスできないことに注意してください。

エンドポイントを作成するには

  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. 左側のナビゲーションメニューで、[エンドポイント] を選択します。

  3. [Create Endpoint] を選択します。

  4. [エンドポイントの作成] ページの [サービスカテゴリ] で、デフォルトの選択である [AWS サービス] をそのままにします。

  5. [サービス名] で、Amazon SNS のサービス名を選択します。

    このサービス名は、選択したリージョンによって異なります。たとえば、米国東部(バージニア北部) を選択した場合、サービス名は com.amazonaws.us-east-1.sns です。

  6. [VPC] で、[VPCE-Tutorial-VPC] と言う名前の VPC を選択します。

    
	                            [エンドポイントの作成] ページの [VPC] メニュー。
  7. [サブネット] で、サブネット ID に [VPCE-Tutorial-Subnet] を持つサブネットを選択します。

    
	                            [エンドポイントの作成] ページのサブネット。
  8. [プライベート DNS 名を有効にする] で、[このエンドポイントで有効にする] を選択します。

  9. [セキュリティグループ] で、[セキュリティグループの選択] を選択し、[VPCE-Tutorial-SecurityGroup] という名前のグループを選択します。

    
	                            [エンドポイントの作成] ページの [セキュリティグループ] メニュー。
  10. [Create endpoint] を選択します。Amazon VPC コンソールで、VPC エンドポイントが作成されたことが確認されます。

    
	                            エンドポイントの作成後に表示される確認メッセージ。
  11. [Close] を選択します。

    Amazon VPC コンソールで [エンドポイント] ページが開きます。新しいエンドポイントのステータスは [保留中] です。数分で、作成プロセスが完了すると、ステータスが [利用可能] に変わります。

    
	                            ステータスが [available (利用可能)] である VPC エンドポイント。

ステップ 5: Amazon SNS トピックにメッセージを発行する

これで VPC に Amazon SNS のエンドポイントが含まれたので、Amazon EC2 インスタンスにログインし、トピックにメッセージを発行できます。

メッセージを発行するには

  1. ターミナルが Amazon EC2 インスタンスに接続されていない場合は、再度接続します。

    $ ssh -i VPCE-Tutorial-KeyPair.pem ec2-user@instance-hostname
  2. 以前の手順と同じコマンドを実行して、Amazon SNS トピックにメッセージを発行します。今回は、発行の試みが成功すると、Amazon SNS はメッセージ ID を返します。

    $ aws sns publish --region aws-region --topic-arn sns-topic-arn --message "Hello" { "MessageId": "5b111270-d169-5be6-9042-410dfc9e86de" }

ステップ 6: メッセージの配信を確認する

Amazon SNS トピックがメッセージを受け取ると、2 つの Lambda サブスクライブ関数に送信して、メッセージをファンアウトします。これらの関数がメッセージを受け取ると、イベントを CloudWatch ログに記録します。メッセージの配信が成功したことを確認するには、関数が呼び出されたこと、および CloudWatch ログが更新されたことを確認します。

Lambda 関数が呼び出されたことを確認するには

  1. https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. [関数] ページで、[VPCE-Tutorial-Lambda-1] を選択します。

  3. [Monitoring] を選択します。

  4. [呼び出しカウント] グラフを確認します。このグラフには、Lambda 関数が実行された回数が表示されます。

    呼び出しカウントは、トピックにメッセージを発行した回数に一致します。

    
	                            Lambda コンソールの呼び出しカウントのグラフ。

CloudWatch ログが更新されたことを確認するには

  1. https://console.aws.amazon.com/cloudwatch/ にある CloudWatch コンソールを開きます。

  2. 左側のナビゲーションメニューで [ログ] を選択します。

  3. Lambda 関数によって書き込まれたログを確認します。

    1. [/aws/lambda/VPCE-Tutorial-Lambda-1/] ロググループを選択します。

    2. ログストリームを選択します。

    3. ログにエントリ From SNS: Hello が含まれていることを確認します。

      
	                                    CloudWatch ログにエントリ「From SNS:Hello」が含まれている。
    4. コンソール上部の [ロググループ] を選択して、[ロググループ] ページを表示します。次に、/aws/lambda/VPCE-Tutorial-Lambda-2/ ロググループに対して前のステップを繰り返します。

おめでとうございます。 Amazon SNS のエンドポイントを VPC に追加することにより、VPC で管理されるネットワーク内から、トピックにメッセージを発行することができました。メッセージは、パブリックインターネットに公開されることなくプライベートで発行されました。

ステップ 7: クリーンアップ

このチュートリアル用に作成したリソースは、保持することを希望しない限り、今すぐ削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。

まず、Amazon VPC コンソールを使用して VPC エンドポイントを削除します。次に、AWS CloudFormation コンソールでスタックを削除して、作成した他のリソースを削除します。スタックを削除すると、AWS CloudFormation によって AWS アカウントからスタックのリソースが削除されます。

VPC エンドポイントを削除するには

  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. 左側のナビゲーションメニューで、[エンドポイント] を選択します。

  3. 作成したエンドポイントを選択します。

  4. [アクション] を選択してから、[エンドポイントの削除] を選択します。

  5. [エンドポイントの削除] ウィンドウで、[はい、削除します] を選択します。

    エンドポイントのステータスが [削除中] に変わります。削除が完了すると、エンドポイントがページから削除されます。

AWS CloudFormation スタックを削除するには

  1. AWS CloudFormation コンソール(https://console.aws.amazon.com/cloudformation)を開きます。

  2. [VPCE-Tutorial-Stack] スタックを選択します。

  3. [Actions] を選択してから、[Delete Stack] を選択します。

  4. [Delete Stack (スタックの削除)] ウィンドウで、[はい、削除します] を選択します。

    スタックのステータスが DELETE_IN_PROGRESS に変わります。削除が完了すると、スタックがページから削除されます。

このチュートリアルで説明している概念の詳細については、以下のリソースを参照してください。