

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

# Amazon SNS アクセスコントロールのケース例
<a name="sns-access-policy-use-cases"></a>

このセクションでは、アクセスコントロールの一般的なユースケース例をいくつか紹介します。

## トピック AWS アカウント へのアクセスを許可する
<a name="sns-grant-aws-account-access-to-topic"></a>

Amazon SNS にトピックがあり、メッセージの発行など、そのトピックに対して特定のアクションを実行 AWS アカウント することを 1 つ以上の に許可するとします。これは、Amazon SNS API アクション `AddPermission` を使用して実行できます。

`AddPermission` アクションでは、トピック、 AWS アカウント ID のリスト、アクションのリスト、ラベルを指定できます。これによって、Amazon SNS は新しいポリシーステートメントを自動的に生成し、トピックのアクセスコントロールポリシーに追加します。ポリシーステートメントを自分で作成する必要はありません。Amazon SNS が自動的に作成します。後でポリシーを削除する必要がある場合は、`RemovePermission` を呼び出して、アクセス許可の追加時に使用したラベルを指定して削除できます。

たとえば、トピック arn:aws:sns:us-east-2:444455556666:MyTopic `AddPermission`で を呼び出す場合、 AWS アカウント ID 1111-2222-3333、 `Publish`アクション、ラベル を指定すると`grant-1234-publish`、Amazon SNS は次のポリシーステートメントを生成し、トピックのアクセスコントロールポリシーに挿入します。

```
{
  "Statement": [{
    "Sid": "grant-1234-publish",
    "Effect": "Allow",
    "Principal": {
      "AWS": "111122223333"
    },
    "Action": ["sns:Publish"],
    "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic"
  }]
}
```

このステートメントが追加されると、 AWS アカウント 1111-2222-3333 にはトピックにメッセージを発行するアクセス許可が付与されます。

**追加情報:**
+ **カスタムポリシー管理:** `AddPermission` はアクセス許可の付与には便利ですが、条件の追加や特定の IAM ロールまたはサービスへのアクセス許可の付与など、より複雑なシナリオでは、多くの場合、トピックのアクセスコントロールポリシーを手動で管理すると便利です。これを行うには、`SetTopicAttributes` API を使用して、ポリシー属性を直接更新します。
+ **セキュリティのベストプラクティス:** アクセス許可を付与する場合は、信頼できる AWS アカウント またはエンティティのみが Amazon SNS トピックにアクセスできるように注意してください。セキュリティを維持するには、トピックにアタッチされているポリシーを定期的に確認および監査します。
+ **ポリシーの制限:** Amazon SNS ポリシーのサイズと複雑さには制限があることに注意してください。多くのアクセス許可や複雑な条件を追加する必要がある場合は、ポリシーがこれらの制限内に収まるようにしてください。

## HTTPS へのサブスクリプションの制限
<a name="sns-limit-subscriptions-to-https"></a>

Amazon SNS トピックの通知配信プロトコルを HTTPS に制限するには、カスタムポリシーを作成する必要があります。Amazon SNS の `AddPermission` アクションでは、トピックへのアクセスを許可するときにプロトコル制限を指定することはできません。したがって、この制限を適用するポリシーを手動で作成し、`SetTopicAttributes` アクションを使用してポリシーをトピックに適用する必要があります。

サブスクリプションを HTTPS に制限するポリシーを作成する方法は次のとおりです。

1. **ポリシーを作成します。**ポリシーは、アクセスを許可する AWS アカウント ID を指定し、HTTPS サブスクリプションのみを許可する条件を適用する必要があります。以下は、使用されるプロトコルが HTTPS である場合にのみ、トピックをサブスクライブするアクセス許可を AWS アカウント ID 1111-2222-3333 に付与するポリシーの例です。

   ```
   {
     "Statement": [{
       "Sid": "Statement1",
       "Effect": "Allow",
       "Principal": {
         "AWS": "111122223333"
       },
       "Action": ["sns:Subscribe"],
       "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
       "Condition": {
         "StringEquals": {
           "sns:Protocol": "https"
         }
       }
     }]
   }
   ```

1. **ポリシーを適用します。**Amazon SNS API の `SetTopicAttributes`アクションを使用して、このポリシーをトピックに適用します。トピックの `Policy` 属性を、作成した JSON ポリシーに設定します。

   ```
   snsClient.setTopicAttributes(SetTopicAttributesRequest.builder()
           .topicArn("arn:aws:sns:us-east-2:444455556666:MyTopic")
           .attributeName("Policy")
           .attributeValue(jsonPolicyString)  // The JSON policy as a string
           .build());
   ```

**追加情報:**
+ **アクセスコントロールのカスタマイズ。**このアプローチにより、サブスクリプションプロトコルの制限など、`AddPermission` アクションだけでは実行できない、より詳細なアクセスコントロールを適用できます。カスタムポリシーは、プロトコルの強制や IP アドレスの制限など、特定の条件を必要とするシナリオに柔軟性を提供します。
+ **セキュリティのベストプラクティス。**サブスクリプションを HTTPS に制限すると、転送中のデータが暗号化され、通知のセキュリティが向上します。トピックポリシーを定期的に確認し、セキュリティとコンプライアンスの要件を満たしていることを確認します。
+ **ポリシーのテスト。**ポリシーを本番環境に適用する前に、開発環境でテストし、想定どおりに動作することを確認します。これにより、偶発的なアクセスの問題や意図しない制限を防ぐことができます。

## Amazon SQS キューに発行する。
<a name="sns-publish-messages-to-sqs-queue"></a>

Amazon SNS トピックから Amazon SQS キューにメッセージを発行するには、Amazon SQS キューに適切なアクセス許可を設定する必要があります。Amazon SNS と Amazon SQS はどちらも AWSアクセスコントロールポリシー言語を使用しますが、Amazon SQS Amazon SNS キューにポリシーを明示的に設定する必要があります。

これを実現するには、`SetQueueAttributes` アクションを使用して Amazon SQS キューにカスタムポリシーを適用します。Amazon SNS とは異なり、Amazon SQS は `AddPermission` アクションによる条件付きポリシーステートメントの作成をサポートしていません。したがって、ポリシーを手動で作成する必要があります。

以下は、キューにメッセージを送信するアクセス許可を Amazon SNS に付与する Amazon SQS ポリシーの例です。このポリシーは、Amazon SNS トピックではなく、Amazon SQS キューに関連付けられていることに注意してください。指定されたアクションは Amazon SQS アクションであり、リソースはキューの Amazon リソースネーム (ARN) です。`GetQueueAttributes` アクションを使用して、キューの ARN を取得できます。

```
{
  "Statement": [{
    "Sid": "Allow-SNS-SendMessage",
    "Effect": "Allow",
    "Principal": {
      "Service": "sns.amazonaws.com"
    },
    "Action": ["sqs:SendMessage"],
    "Resource": "arn:aws:sqs:us-east-2:444455556666:MyQueue",
    "Condition": {
      "ArnEquals": {
        "aws:SourceArn": "arn:aws:sns:us-east-2:444455556666:MyTopic"
      }
    }
  }]
}
```

このポリシーは、送信されるメッセージのソースに基づいて、SQS キューへのアクセスを制限する `aws:SourceArn` 条件を使用します。これにより、指定された SNS トピック (この場合は、arn:aws:sns:us-east-2:444455556666:MyTopic) から発信されたメッセージのみがキューに配信されます。

**追加情報:**
+ **キュー ARN。**`GetQueueAttributes` アクションを使用して、Amazon SQS キューの正しい ARN を取得していることを確認します。この ARN は、正しいアクセス許可を設定するために不可欠です。
+ **セキュリティのベストプラクティス。**ポリシーを設定するときは、常に最小特権の原則に従います。Amazon SQS キューとやり取りするために必要な権限のみを Amazon SNS トピックに付与し、ポリシーを定期的にレビューして、ポリシーが最新かつ安全であることを確認します。
+ **Amazon SNS のデフォルトポリシー。**Amazon SNS は、他の AWS のサービス または アカウントが新しく作成されたトピックにアクセスすることを許可するデフォルトのポリシーを自動的に付与しません。デフォルトでは、Amazon SNS トピックはアクセス許可なしで作成されます。つまり、それらのトピックはプライベートであり、トピックを作成したアカウントのみがアクセスできます。他の、アカウント AWS のサービス、またはプリンシパルのアクセスを有効にするには、 トピックにアクセスポリシーを明示的に定義してアタッチする必要があります。これは最小特権の原則に従い、意図しないアクセスがデフォルトで付与されないようにするための措置です。
+ **テストと検証。**ポリシーを設定したら、Amazon SNS トピックにメッセージを発行し、それらが Amazon SQS キューに正常に配信されることを確認して、統合をテストします。これにより、ポリシーが正しく設定されていることを確認できます。

## Amazon S3 イベント通知がトピックに発行することを許可する
<a name="sns-allow-s3-bucket-to-publish-to-topic"></a>

別の の Amazon S3 バケット AWS アカウント が Amazon SNS トピックにイベント通知を発行できるようにするには、それに応じてトピックのアクセスポリシーを設定する必要があります。そのためには、特定の AWS アカウント から Amazon S3 サービスにアクセス許可を付与するカスタムポリシーを作成し、そのポリシーを Amazon SNS トピックに適用します。

設定の方法は次のとおりです。

1. **ポリシーを作成します。**ポリシーは、Amazon SNS トピックに発行するために必要なアクセス許可を Amazon S3 サービス (s3.amazonaws.com) に付与します。`SourceAccount` 条件を使用して AWS アカウント、Amazon S3 バケットを所有する指定された のみがトピックに通知を発行できるようにします。

   次に、ポリシーの例を示します。

   ```
   {
     "Statement": [{
       "Effect": "Allow",
        "Principal": { 
         "Service": "s3.amazonaws.com" 
       },
       "Action": "sns:Publish",
       "Resource": "arn:aws:sns:us-east-2:111122223333:MyTopic",
       "Condition": {
         "StringEquals": {
           "AWS:SourceAccount": "444455556666"
         }       
       }
     }]
   }
   ```
   + **トピック所有者** – 111122223333 は、Amazon SNS トピックを所有する AWS アカウント ID です。
   + **Amazon S3 バケット所有者 **– 444455556666 は、Amazon S3 バケット送信通知を所有する AWS アカウント ID です。 Amazon S3 

1. **ポリシーを適用します。**`SetTopicAttributes` アクションを使用して、Amazon SNS トピックにこのポリシーを設定します。これにより、トピックのアクセスコントロールが更新され、カスタムポリシーで指定されたアクセス許可が含まれます。

   ```
   snsClient.setTopicAttributes(SetTopicAttributesRequest.builder()
           .topicArn("arn:aws:sns:us-east-2:111122223333:MyTopic")
           .attributeName("Policy")
           .attributeValue(jsonPolicyString)  // The JSON policy as a string
           .build());
   ```

**追加情報:**
+ **`SourceAccount` 条件の使用。**この`SourceAccount`条件により、この場合は指定された AWS アカウント (444455556666) から発生したイベントのみが Amazon SNS トピックをトリガーできるようになります。これは、不正なアカウントがトピックに通知を送信できないようにするセキュリティ対策です。
+ **`SourceAccount` をサポートするその他のサービス。**`SourceAccount` 条件は、次のサービスでサポートされています。発信元アカウントに基づいて Amazon SNS トピックへのアクセスを制限する場合は、この条件を使用することが重要です。
  + Amazon API Gateway
  + Amazon CloudWatch
  + Amazon DevOps Guru
  + Amazon EventBridge
  + Amazon GameLift Servers
  + Amazon Pinpoint SMS および音声 API
  + Amazon RDS
  + Amazon Redshift
  + Amazon Glacier
  + Amazon SES
  + Amazon Simple Storage Service
  + AWS CodeCommit
  + Directory Service
  + AWS Lambda
  + AWS Systems Manager Incident Manager
+ **テストと検証。**ポリシーを適用したら、Amazon S3 バケットでイベントをトリガーしてセットアップをテストし、Amazon SNS トピックに正常に発行されることを確認します。これにより、ポリシーが正しく設定されていることを確認します。
+ **セキュリティのベストプラクティス。**Amazon SNS トピックポリシーを定期的に確認して監査し、セキュリティ要件に準拠していることを確認します。安全なオペレーションを維持するには、信頼できるアカウントとサービスのみにアクセスを制限することが不可欠です。

## Amazon SES が別のアカウントが所有するトピックへの発行を許可する
<a name="sns-allow-specified-service-to-publish-to-topic"></a>

別の が所有するトピック AWS のサービス への発行を別の に許可できます AWS アカウント。111122223333 アカウントにサインインし、Amazon SES を開き、E メールを作成したとします。この E メールに関する通知を、444455556666 アカウントが所有する Amazon SNS トピックに発行するには、以下のようなポリシーを作成します。そのためには、プリンシパル (他のサービス) と各リソースの所有権に関する情報を提供する必要があります。`Resource` ステートメントは、トピック所有者のアカウント ID 444455556666 を含むトピック ARN を提供します。`"aws:SourceOwner": "111122223333"` ステートメントは、アカウントがその E メールを所有することを指定します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "Service": "ses.amazonaws.com"
      },
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
      "Condition": {
        "StringEquals": {
          "aws:SourceOwner": "111122223333"
        }
      }
    }
  ]
}
```

------

Amazon SNS にイベントを発行する場合、以下のサービスで `aws:SourceOwner` を使用できます。
+ Amazon API Gateway
+ Amazon CloudWatch
+ Amazon DevOps Guru
+ Amazon GameLift Servers
+ Amazon Pinpoint SMS および音声 API
+ Amazon RDS
+ Amazon Redshift
+ Amazon SES
+ AWS CodeCommit
+ Directory Service
+ AWS Lambda
+ AWS Systems Manager Incident Manager

## `aws:SourceAccount` と `aws:SourceOwner`
<a name="source-account-versus-source-owner"></a>

**重要**  
`aws:SourceOwner` は廃止されました。新しいサービスを Amazon SNS と統合できるのは、`aws:SourceArn` と `aws:SourceAccount` を使用した場合のみです。Amazon SNS は、現在 `aws:SourceOwner` をサポートしている既存のサービスとの下位互換性を引き続き維持しています。

`aws:SourceAccount` 条件キーと `aws:SourceOwner` 条件キーは、一部の AWS のサービス が Amazon SNS トピックに発行するときに、それぞれ設定されます。サポートされている場合、値は、サービスがデータを発行する の 12 桁の AWS アカウント ID になります。サービスによってサポートするものは変わります。
+ Amazon S3 通知の使用方法`aws:SourceAccount`と、その条件をサポートする AWS サービスのリスト[Amazon S3 イベント通知がトピックに発行することを許可する](#sns-allow-s3-bucket-to-publish-to-topic)については、「」を参照してください。
+ Amazon SES が を使用する方法`aws:SourceOwner`と、その条件をサポートする AWS サービスのリスト[Amazon SES が別のアカウントが所有するトピックへの発行を許可する](#sns-allow-specified-service-to-publish-to-topic)については、「」を参照してください。

## の組織内のアカウントが別のアカウントのトピックに発行 AWS Organizations することを許可する
<a name="sns-allow-organization-to-publish-to-topic-in-another-account"></a>

この AWS Organizations サービスは、請求の一元管理、アクセスとセキュリティの制御、 間でのリソースの共有に役立ちます AWS アカウント。

組織 ID は [Organizations コンソール](https://console.aws.amazon.com/organizations/)で確認できます。詳細については、「[管理アカウントからの組織の詳細の表示](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html#orgs_view_org)」を参照してください。

この例では、組織 AWS アカウント 内のすべての がアカウント `MyTopic`の Amazon SNS トピックに発行`myOrgId`できます`444455556666`。ポリシーでは、`aws:PrincipalOrgID` グローバル条件キーを使用して組織 ID 値を確認します。

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "myOrgId"
                }
            }
        }
    ]
}
```

## CloudWatch アラームに別のアカウントのトピックへの発行を許可する
<a name="sns-allow-cloudwatch-alarm-to-publish-to-topic-in-another-account"></a>

異なる AWS アカウント間で CloudWatch アラームを使用して Amazon SNS トピックを呼び出すには、次の手順を実行します。この例では、次の 2 つのアカウントを使用します。
+ **アカウント A** は CloudWatch アラームの作成に使用されます。
+ **アカウント B** は SNS トピックの作成に使用されます。

**アカウント B で SNS トピックを作成する**

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

1. ナビゲーションペインで、[**Topics (トピック)**]、[**Create topic (トピックの作成)**] の順に選択してください。

1. トピックタイプの **[標準]** を選択し、トピックの名前を作成します。

1. **[トピックの作成]** を選択し、トピックの **ARN** をコピーします。

1. ナビゲーションペインで、**[Subscriptions]** (サブスクリプション) を選択して、**[Create subscription]** (サブスクリプションの作成) を選択します。

1. **[トピック ARN]** セクションにトピックの ARN を追加し、プロトコルに **[E メール]** を選択して、**E メールアドレス**を入力します。

1. **[サブスクリプションの作成]** を選択し、E メールを調べて、**サブスクリプションを確認します**。

**アカウント A で CloudWatch アラームを作成する**

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

1. ナビゲーションペインで、**[アラーム]** を選択し、**[アラームを作成]** を選択します。

1. アラームを作成していない場合は、ここで作成します。アラームが作成されている場合は、**メトリクス**を選択し、しきい値と比較パラメータの詳細を指定します。

1. **[アクションの設定]** の **[通知]** で **[トピック ARN を使用して他のアカウントに通知]** を選択し、アカウント B の**トピック ARN** を入力します。

1. アラームの名前を作成し、**[アラームを作成]** を選択します。

**アカウント B の SNS トピックのアクセスポリシーを更新する**

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

1. ナビゲーションペインで、**[トピック]** を選択し、トピックを選びます。

1. **[編集]** を選択し、ポリシーに以下のコードを追加します。

**注記**  
以下のポリシーの例に示されている値を、独自の値に置き換えてください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "__default_policy_ID",
    "Statement": [
        {
            "Sid": "__default_statement_ID",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "SNS:GetTopicAttributes",
                "SNS:SetTopicAttributes",
                "SNS:AddPermission",
                "SNS:RemovePermission",
                "SNS:DeleteTopic",
                "SNS:Subscribe",
                "SNS:ListSubscriptionsByTopic",
                "SNS:Publish"
            ],
            "Resource": "arn:aws:cloudwatch:us-west-1:{{111122223333}}:alarm:",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:cloudwatch:us-west-1:{{111122223333}}:alarm:"
                }
            }
        }
    ]
}
```

------

**アラームをテストする**

アラームをテストするには、メトリクスデータポイントに基づいてアラームのしきい値を変更するか、アラームの状態を手動で変更します。アラームのしきい値またはアラームの状態を変更すると、E メール通知が届きます。

**ローカルの Amazon SNS トピックを使用してメッセージを転送するための回避策**

CloudWatch アラーム用にクロスアカウントの Amazon SNS 通知を有効にするには、次の手順を実行します。

1. **CloudWatch アラーム** (111122223333) と同じアカウントに [**Amazon SNS トピック**](sns-create-topic.md)を作成します。

1. その Amazon SNS トピックに [**Lambda 関数**](lambda-console.md)または [Amazon EventBridge ルール](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-s3-object-created-tutorial.html)をサブスクライブします。

1. これにより、Lambda 関数や EventBridge ルールは、ターゲットアカウント (444455556666) の Amazon SNS トピックにメッセージを発行できます。

## Amazon SNS トピックの発行を特定の VPC エンドポイントのみからに制限する
<a name="sns-restrict-publication-only-from-specified-vpc-endpoint"></a>

この場合、アカウント 444455556666 内のトピックは、ID `vpce-1ab2c34d` の VPC エンドポイントのみからの発行を許可されます。

```
{
  "Statement": [{
    "Effect": "Deny",
    "Principal": "*",
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
    "Condition": {
      "StringNotEquals": {
        "aws:sourceVpce": "vpce-1ab2c34d"
      }
    }
  }]
}
```