

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

# Amazon VPC から Amazon SNS メッセージを発行する
<a name="sns-vpc-tutorial"></a>

このセクションでは、プライベートネットワークでメッセージを安全に保ちながら、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 アカウントで作成するプライベートネットワークを示しています。

![このステップで作成するプライベートネットワークのアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-architecture.png)


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

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

**Topics**
+ [[開始する前に]](#sns-vpc-prereqs)
+ [ステップ 1: キーペアを作成する](#sns-vpc-keypair)
+ [ステップ2:リソースを作成する](#sns-vpc-resources)
+ [ステップ 3: インスタンスのインターネット接続を確認する](#sns-vpc-connection)
+ [ステップ 4: エンドポイントを作成する](#sns-vpc-endpoint)
+ [ステップ 5: メッセージを発行する](#sns-vpc-publish)
+ [ステップ 6: 確認する](#sns-vpc-verify)
+ [ステップ 7: クリーンアップする](#sns-vpc-delete)
+ [関連リソース](#sns-vpc-resources-related)

## [開始する前に]
<a name="sns-vpc-prereqs"></a>

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

## ステップ 1: Amazon EC2 キーペアを作成する
<a name="sns-vpc-keypair"></a>

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

**キーペアを作成するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) で Amazon EC2 コンソールを開きます。

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

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

1. [**キーペアの作成**] ウィンドウで、[**キーペア名**] に「**VPCE-Tutorial-KeyPair**」と入力します。続いて、[**作成**] を選択します。  
![キーペア名フィールドに「VPCE-Tutorial-KeyPair」というテキストが含まれる、キーペアの作成ウィンドウ。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-key-pair.png)

1. ブラウザによってプライベートキーファイルが自動的にダウンロードされます。これを安全な場所に保存します。Amazon EC2 により、ファイルに拡張子 `.pem` が付けられます。

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

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

      ```
      $ cd /{{filepath_to_private_key}}/
      ```

   1. 次のコマンドを使用してアクセス権限を設定します。

      ```
      $ chmod 400 VPCE-Tutorial-KeyPair.pem
      ```

## ステップ 2: AWS リソースを作成する
<a name="sns-vpc-resources"></a>

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

テンプレートを に提供し CloudFormation、 で*スタック*として必要なリソースを CloudFormation プロビジョニングします 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 ウェブサイトから[テンプレート ファイル](https://github.com/aws-samples/aws-sns-samples/blob/master/templates/SNS-VPCE-Tutorial-CloudFormation.template)をダウンロードします。

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation) にサインインします。

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

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

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

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

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

   1. [**SSHLocation**] で、デフォルト値の **0.0.0.0/0** のままにします。  
![スタック名、KeyName、SSHLocation の入力値フィールドが表示されている、詳細の指定ページ。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-stack-name.png)

   1. [**次へ**] を選択します。

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

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

1. **機能**で、 がカスタム名で IAM リソースを作成する CloudFormation 可能性があることを確認します。

1. **[作成]** を選択します。

    CloudFormation コンソールで **スタックページ**が開きます。VPCE-Tutorial-Stack のステータスは **CREATE\_IN\_PROGRESS** です。数分後に作成プロセスが完了し、ステータスが **CREATE\_COMPLETE** に変わります。  
![ステータスが CREATE_COMPLETE の CloudFormation スタック。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-stack-create-complete.png)
**ヒント**  
[**更新**] ボタンを選択して、スタックの最新のステータスを表示します。

## ステップ 3: Amazon EC2 インスタンスにインターネットアクセスがないことを確認する
<a name="sns-vpc-connection"></a>

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

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

**Amazon EC2 インスタンスに接続します。**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

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

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

1. **[Public DNS]** 列に示されたホスト名をコピーします。  
![によって起動された Amazon EC2 インスタンスに関する詳細 CloudFormation。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-instance-details.png)

1. ターミナルを開きます。キーペアが含まれているディレクトリから、以下のコマンドを使用してインスタンスに接続します。ここで、{{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/home)にサインインします。

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

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

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

   ```
   $ aws sns publish --region {{aws-region}} --topic-arn {{sns-topic-arn}} --message "Hello"
   ```

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

## ステップ 4: Amazon SNSの Amazon VPC エンドポイントを作成する
<a name="sns-vpc-endpoint"></a>

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

**注記**  
インスタンスは、インターネット上の他の AWS サービスやエンドポイントにアクセスできません。

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

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

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

1. [**エンドポイントの作成**] を選択します。

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

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

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

1. [**VPC**] で、[**VPCE-Tutorial-VPC**] と言う名前の VPC を選択します。  
![[エンドポイントの作成] ページの [VPC] メニュー。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-create-endpoint-vpc.png)

1. [**サブネット**] で、サブネット ID に *VPCE-Tutorial-Subnet* を持つサブネットを選択します。  
![[エンドポイントの作成] ページのサブネット。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-create-endpoint-subnet.png)

1. [**プライベート DNS 名を有効にする**] で、[**このエンドポイントで有効にする**] を選択します。

1. [**セキュリティグループ**] で、[**セキュリティグループの選択**] を選択し、[**VPCE-Tutorial-SecurityGroup**] を選択します。  
![[エンドポイントの作成] ページの [セキュリティグループ] メニュー。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-create-endpoint-security-group.png)

1. [**エンドポイントの作成**] を選択します。Amazon VPC コンソールで、VPC エンドポイントが作成されたことが確認されます。  
![エンドポイントの作成後に表示される確認メッセージ。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-create-endpoint-confirmation.png)

1. [**閉じる**] を選択します。

   Amazon VPC コンソールの **[エンドポイント] ページ**を開きます。新しいエンドポイントのステータスは [**保留中**] です。数分で、作成プロセスが完了すると、ステータスが [**利用可能**] に変わります。  
![ステータスが [利用可能] である VPC エンドポイント。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-create-endpoint-status-available.png)

## ステップ 5: Amazon SNS トピックにメッセージを発行する
<a name="sns-vpc-publish"></a>

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

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

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

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

1. 以前の手順と同じコマンドを実行して、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: メッセージの配信を確認する
<a name="sns-vpc-verify"></a>

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

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

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) で AWS Lambda コンソールを開きます。

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

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

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

   呼び出しカウントは、トピックにメッセージを発行した回数に一致します。  
![Lambda コンソールの呼び出しカウントのグラフ。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-lambda-invocation-count.png)

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

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

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

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

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

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

   1. ログにエントリ `From SNS: Hello` が含まれていることを確認します。  
![CloudWatch Logs にエントリ「From SNS:Hello」が含まれています。](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/vpce-tutorial-cloudwatch-log.png)

   1. コンソール上部の [**ロググループ**] を選択して、[**ロググループ**] ページを表示します。次に、/aws/lambda/VPCE-Tutorial-Lambda-2/ ロググループに対して前のステップを繰り返します。

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

## ステップ 7: クリーンアップする
<a name="sns-vpc-delete"></a>

作成したリソースは、保持することを希望しない限り、今すぐ削除できます。使用しなくなった AWS リソースを削除することで、 への不要な課金を防ぐことができます AWS アカウント。

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

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

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

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

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

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

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

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

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

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

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

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

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

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

## 関連リソース
<a name="sns-vpc-resources-related"></a>

詳細については、以下のリソースを参照してください。
+ [AWS セキュリティブログ: PrivateLink を使用して AWS Amazon SNS に発行されたメッセージを保護する ](https://aws.amazon.com/blogs/security/securing-messages-published-to-amazon-sns-with-aws-privatelink/)
+ [Amazon VPC とは?](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Introduction.html)
+ [VPC エンドポイント](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)
+ [Amazon EC2 とは?](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html)
+ [CloudFormation の概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html)