

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon SNS 存取控制的範例案例
<a name="sns-access-policy-use-cases"></a>

本節提供幾個存取控制的一般使用案例的範例。

## 授予對主題的 AWS 帳戶 存取權
<a name="sns-grant-aws-account-access-to-topic"></a>

假設您在 Amazon SNS 中有一個主題，而且您想要允許一或多個 對該主題 AWS 帳戶 執行特定動作，例如發佈訊息。您可以使用 Amazon SNS API 動作 來完成此操作`AddPermission`。

`AddPermission` 動作可讓您指定主題、 AWS 帳戶 IDs 清單、動作清單和標籤。然後，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 訂閱的條件。以下是範例政策，授予 AWS 帳戶 ID 1111-2222-3333 訂閱主題的許可，但前提是使用的通訊協定是 HTTPS。

   ```
   {
     "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 SQS 政策的範例，該政策授予 Amazon SNS 將訊息傳送到佇列的許可。請注意，此政策與 Amazon SQS 佇列相關聯，而不是與 Amazon SNS 主題相關聯。指定的動作是 Amazon SQS 動作，而資源是佇列的 Amazon Resource Name (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"
      }
    }
  }]
}
```

此政策使用 `aws:SourceArn`條件，根據所傳送訊息的來源限制對 SQS 佇列的存取。這可確保只允許來自指定 SNS 主題 （在此情況下為 arn：aws：sns：us-east-2：444455556666：MyTopic) 的訊息傳送到佇列。

**其他資訊：**
+ **佇列 ARN。**請確定您使用 `GetQueueAttributes`動作擷取 Amazon SQS 佇列的正確 ARN。此 ARN 對於設定正確的許可至關重要。
+ **安全最佳實務。**設定政策時，請務必遵循最低權限原則。僅授予 Amazon SNS 主題與 Amazon SQS 佇列互動的必要許可，並定期檢閱您的政策，以確保其up-to-date且安全
+ **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 主題，您需要相應地設定主題的存取政策。這包括撰寫自訂政策，從特定 將許可授予 Amazon S3 服務， AWS 帳戶 然後將此政策套用至您的 Amazon SNS 主題。

以下是您可以設定的方式：

1. **撰寫政策。**政策應授予 Amazon S3 服務 (s3.amazonaws.com) 發佈至 Amazon SNS 主題的必要許可。您將使用 `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。

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 and Voice 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，並建立了一個電子郵件。若要將此電子郵件的通知發佈到 444455556666 帳戶擁有的 Amazon SNS 主題，您必須建立如下所示的政策。若要這麼做，您需要提供有關主體 (其他服務) 和每個資源擁有權的資訊。`Resource` 陳述式提供主題 ARN，其中包括主題擁有者的帳戶 ID 444455556666。`"aws:SourceOwner": "111122223333"` 陳述式會指定您的帳戶擁有該電子郵件。

------
#### [ 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 and Voice 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` 已棄用，新服務只能透過 `aws:SourceArn` 和 `aws:SourceAccount` 與 Amazon SNS 整合。對於目前支援 `aws:SourceOwner` 的現有服務，Amazon SNS 仍維持回溯相容性。

`aws:SourceAccount` 和 `aws:SourceOwner` 條件金鑰是由一些發布至 Amazon SNS 主題的 AWS 服務 所設定的。支援時，該值將是服務代表其發佈資料的 12 位數 AWS 帳戶 ID。有些服務支持一個，有些支持另一個。
+ 如需 Amazon S3 通知的使用[允許 Amazon S3 事件通知發佈至主題](#sns-allow-s3-bucket-to-publish-to-topic)方式，`aws:SourceAccount`以及支援該條件 AWS 的服務清單，請參閱 。
+ 如需 [允許 Amazon SES 發佈到其他帳戶擁有的主題](#sns-allow-specified-service-to-publish-to-topic) Amazon SES 如何使用 `aws:SourceOwner`和支援該條件 AWS 的服務清單，請參閱 。

## 允許 中組織中的帳戶 AWS Organizations 發佈至不同帳戶中的主題
<a name="sns-allow-organization-to-publish-to-topic-in-another-account"></a>

 AWS Organizations 此服務可協助您集中管理帳單、控制存取和安全性，以及跨 共用資源 AWS 帳戶。

您可以在[組織主控台](https://console.aws.amazon.com/organizations/)中找到您的組織 ID。如需詳細資訊，請參閱[從管理帳戶檢視組織的詳細資訊](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html#orgs_view_org)。

在此範例中， AWS 帳戶 組織中的任何 `myOrgId`都可以發佈至帳戶 `MyTopic`中的 Amazon SNS 主題`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>

使用下列步驟，透過不同 的 CloudWatch 警示叫用 Amazon SNS 主題 AWS 帳戶。此範例使用兩個帳戶：
+ **帳戶 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**，選擇**電子郵件**做為通訊協定，然後**輸入電子郵件地址**。

1. 選擇**建立訂閱**，然後檢查您的電子郵件**以確認訂閱**。

**在帳戶 A 中建立 CloudWatch 警示**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 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:"
                }
            }
        }
    ]
}
```

------

**測試警示**

若要測試警示，請根據指標資料點變更警示閾值，或手動變更警示狀態。當您變更警示閾值或警示狀態時，您會收到電子郵件通知。

**使用本機 Amazon SNS 主題和轉送訊息的解決方法**

使用下列步驟為 CloudWatch 警示啟用跨帳戶 Amazon SNS 通知：

1. 在與 **CloudWatch 警示** ((111122223333) 相同的帳戶中建立 [**Amazon SNS 主題**](sns-create-topic.md)。

1. 訂閱 [**Lambda 函數**](lambda-console.md)或 [Amazon EventBridge 規則](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-s3-object-created-tutorial.html)至該 Amazon SNS 主題。

1. 然後，Lambda 函數或 EventBridge 規則可以將訊息發佈到目標帳戶 (444455556666) 中的 Amazon SNS 主題。

## 限制僅從特定 VPC 端點發佈至 Amazon SNS 主題
<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"
      }
    }
  }]
}
```