Amazon VPC から Amazon SNS メッセージを発行する - Amazon Simple Notification Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

このステップの完了には 20 分ほどかかります。

開始する前に

開始する前に、Amazon Web Services (AWS) アカウントが必要です。サインアップすると、Amazon SNS および Amazon VPC を含む AWS のすべてのサービスに対してお客様のアカウントが自動的にサインアップされます。アカウントをまだ作成していない場合は、https://aws.amazon.com/ に移動し、[まずは無料で始める] を選択します。

ステップ 1: Amazon EC2 キーペアを作成する

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

キーペアを作成するには
  1. AWS Management Console にサインインし、Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

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

  3. [キーペアの作成] を選択します。

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

    [キーペアの作成] ウィンドウ。
  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 Logs への書き込みを Lambda 関数に許可する IAM ロール。

AWS リソースを作成するには
  1. GitHub ウェブサイトからテンプレート ファイルをダウンロードします。

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

  3. [スタックの作成] を選択します。

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

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

    1. [スタックの名前] に VPCE-Tutorial-Stack を入力します。

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

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

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

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

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

  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. Amazon EC2 コンソール (https://console.aws.amazon.com/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 コンソールにサインインします。

  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. [エンドポイントの作成] を選択します。

  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. [エンドポイントの作成] を選択します。Amazon VPC コンソールで、VPC エンドポイントが作成されたことが確認されます。

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

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

    ステータスが [利用可能] である 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 Logs に記録します。メッセージの配信が成功したことを確認するには、関数が呼び出されたこと、および CloudWatch Logs が更新されたことを確認します。

Lambda 関数が呼び出されたことを確認するには
  1. AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

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

  3. [モニタリング] を選択します。

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

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

    Lambda コンソールの呼び出しカウントのグラフ。
CloudWatch Logs が更新されたことを確認するには
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

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

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

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

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

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

      CloudWatch Logs にエントリ「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. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

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

  3. [アクション] を選択してから、[スタックの削除] を選択します。

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

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

詳細については、以下のリソースを参照してください。