本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon SNS 訪問控制的示例案例
本節提供幾個存取控制的一般使用案例的範例。
主題
授與主題的 AWS 帳戶 存取權
假設您在 Amazon SNS 系統中有一個話題。在最簡單的情況下,您想要允許一或多個 AWS 帳戶 存取特定主題動作 (例如,「發佈」)。
您可以使用 Amazon SNS API 行動做到這一點AddPermission
。它採用主題、清單 AWS 帳戶 IDs、動作清單和標籤,並在主題的存取控制原則中自動建立新陳述式。在這種情況下,您不需要自己撰寫政策,因為 Amazon 會SNS自動為您產生新的政策聲明。您可以透過呼叫 RemovePermission
及其標籤稍後將政策陳述式移除。
例如,如果您呼叫AddPermission
主題 arn: aw: sn: US-東-2:444455556666:MyTopic, 與 AWS 帳戶 ID 1111-2222-3333, 動作和標籤, Amazon 將生成並插入以下存取控制政策聲明:Publish
grant-1234-publish
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 的使用者就可以將訊息發佈至主題。
將訂閱限制為 HTTPS
在下列範例中,您將通知傳遞通訊協定限制為HTTPS。
您需要知道如何為該主題編寫自己的政策,因為 Amazon SNS AddPermission
動作不允許您在授予某人訪問您的主題時指定協議限制。在此狀況下,您撰寫您自己的政策,然後使用 SetTopicAttributes
動作設定主題的 Policy
屬性到您的新政策。
下列完整原則範例會授與 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" } } }] }
將訊息發佈到 Amazon SQS 佇列
在此使用案例中,您想要將主題中的訊息發佈到 Amazon SQS 佇列。像 Amazon 一樣SNS,Amazon SQS 使用亞馬遜的訪問控制政策語言。要允許 Amazon SNS 發送消息,您需要使用 Amazon SQS 動作SetQueueAttributes
在隊列上設置策略。
同樣地,您需要知道如何撰寫自己的政策,因為 Amazon SQS AddPermission
動作不會建立具有條件的政策陳述式。
注意
下面顯示的示例是 Amazon SQS 政策(控制對隊列的訪問),而不是 Amazon SNS 政策(控制對主題的訪問)。這些動作是 Amazon 的SQS動作,和資源是 Amazon 資源名稱(ARN)隊列。您可以透ARN過使用GetQueueAttributes
動作擷取佇列的QueueArn
屬性來判斷佇列。
{ "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
條件,根據將傳送至佇列之訊息的來源,來限制對於佇列的存取。您可以使用這種類型的政策,只有當消息SNS來自您自己的主題之一時,才允許 Amazon 將消息發送到隊列。在這種情況下,您可以指定您的主題中的一個特定主題,其中一個主題ARN是:awn:SNS:美國東部 2:444455556666:。MyTopic
上述政策是您可以寫入並新增至特定佇列的 Amazon SQS 政策範例。它將授予訪問 Amazon SNS 和其他 AWS 服務。Amazon 向所有新建立的主題SNS授予預設政策。預設原則會將您主題的存取權授與所有其他 AWS 服務。此預設原則會使用aws:SourceArn
條件來確保 AWS 服務僅代表您擁有的 AWS
資源存取您的主題。
允許 Amazon S3 事件通知發佈至主題
在這種情況下,您想要設定主題的政策,以便其他人 AWS 帳戶的 Amazon S3 儲存貯體可以發佈到您的主題。如需關於 Amazon S3 發佈通知的詳細資訊,請前往設定儲存貯體事件的通知。
此範例假設您撰寫您自己的政策,然後使用 SetTopicAttributes
動作設定主題的 Policy
屬性到您的新政策。
下列範例陳述式會使用 SourceAccount
條件來確保只有 Amazon S3 擁有者帳戶可以存取主題。在此範例中,主題擁有者是 111122223333,而 Amazon S3 擁有者是 444455556666。這個範例指出,任何由 444455556666 擁有的 Amazon S3 儲存貯體都可以發佈到。 MyTopic
{ "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" } } }] }
將事件發佈到 Amazon 時SNS,支援下列服務aws:SourceAccount
:
-
Amazon API 网关
-
Amazon CloudWatch
-
Amazon DevOps 大師
-
Amazon ElastiCache
-
Amazon EventBridge
-
Amazon GameLift
-
Amazon Pinpoint SMS 和語音 API
-
Amazon RDS
-
Amazon Redshift
-
Amazon S3 Glacier
-
Amazon SES
-
Amazon Simple Storage Service
-
AWS CodeCommit
-
AWS Directory Service
-
AWS Lambda
-
AWS Systems Manager Incident Manager
允許 Amazon 發布SES到另一個帳戶擁有的主題
您可以允許其他 AWS 服務發佈至另一個服務所擁有的主題 AWS 帳戶。假設您登錄了 111122223333 帳戶,開設了 AmazonSES,並創建了一封電子郵件。若要將有關此電子郵件的通知發佈到 444455556666 帳戶擁有的 Amazon SNS 主題,您需要建立類似下列的政策。若要這麼做,您需要提供有關主體 (其他服務) 和每個資源擁有權的資訊。該Resource
聲明提供主題ARN,其中包括主題擁有者的帳戶識別碼 444455556666。"aws:SourceOwner": "111122223333"
陳述式會指定您的帳戶擁有該電子郵件。
{ "Version": "2008-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 网关
-
Amazon CloudWatch
-
Amazon DevOps 大師
-
Amazon ElastiCache
-
Amazon GameLift
-
Amazon Pinpoint SMS 和語音 API
-
Amazon RDS
-
Amazon Redshift
-
Amazon SES
-
AWS CodeCommit
-
AWS Directory Service
-
AWS Lambda
-
AWS Systems Manager Incident Manager
aws:SourceAccount
與 aws:SourceOwner
的比較
重要
aws:SourceOwner
已淘汰,新服務SNS只能透過aws:SourceArn
和與 Amazon 整合aws:SourceAccount
。對於目前支援的現有服務,Amazon SNS 仍維持向後相容性aws:SourceOwner
。
當aws:SourceAccount
和aws:SourceOwner
條件密鑰發布到 Amazon SNS 主題 AWS 服務 時,每個密鑰都由某些密鑰設置。受支援時,此值將是代表服務發佈資料的 12 位數 AWS 帳戶 ID。有些服務支持一個,有些支持另一個。
-
請參允許 Amazon S3 事件通知發佈至主題閱以瞭解 Amazon S3 通知的使用方式,以
aws:SourceAccount
及支援該條件的 AWS 服務清單。 -
請參允許 Amazon 發布SES到另一個帳戶擁有的主題閱 Amazon 如何SES使用以
aws:SourceOwner
及支援該條件的 AWS 服務清單。
允許中組織中的帳號發佈 AWS Organizations 至不同帳戶中的主題
此 AWS Organizations 服務可協助您集中管理帳單、控制存取和安全性,以及共用您的 AWS 帳戶.
您可以在組織主控台
在此示例中,組織 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 警示發佈至不同帳戶中的主題
在這種情況下,帳戶中的任何 CloudWatch 警報111122223333
都可以發佈到帳戶中的 Amazon SNS 主題444455556666
。
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:us-east-2:111122223333:alarm:*" } } } ] }
限制僅從特定VPC端點發佈到 Amazon SNS 主題
在此情況下,帳戶 444455556666 中的主題只能從具有識別碼的端點發佈。VPC vpce-1ab2c34d
{ "Statement": [{ "Effect": "Deny", "Principal": "*", "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1ab2c34d" } } }] }