如何使用 IAM EC2 角色从跨账户 Amazon EC2 实例发布到 Amazon SNS 主题?

上次更新日期:2021 年 7 月 20 日

我想从跨账户 Amazon Elastic Compute Cloud (Amazon EC2) 实例发布到 Amazon Simple Notification Service (Amazon SNS) 主题。我想为使用公有子网的 EC2 实例使用 AWS Identity and Access Management (IAM) 角色来执行此操作。

解决方法

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

使用 EC2 实例配置账户

1.    创建具有权限发布到 SNS 主题的 IAM 策略。例如:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid":
    "VisualEditor0",
            "Effect": "Allow",
            "Action": "sns:Publish",
           
    "Resource": "arn:aws:sns:us-east-2:123456789012:cross-account-ec2-sns"
        }
    ]
}

2.    为您的 EC2 实例创建一个 IAM 角色。例如:cross-acc-ec2-sns-publish-role。然后,将策略附上您的 IAM 角色。

3.    在具有互联网访问权限的公有子网中创建 EC2 实例。

将新的 IAM 角色附上您的 EC2 实例

确认您的 EC2 实例正在运行,然后完成以下步骤:

1.    打开 Amazon EC2 控制台

2.    在导航窗格中,选择 Instances(实例)。

3.    选择您的实例 (cross-acc-ec2-sns-publish-role),然后选择操作安全性修改 IAM 角色

4.    选择先前创建的要附上实例的 IAM 角色,然后选择保存

注意:如果您的 EC2 实例无法使用互联网网关连接到互联网,请参阅为何我的 EC2 实例无法使用互联网网关连接到互联网?

使用 SNS 主题配置账户

1.    创建 SNS 主题,名称类似于:cross-account-ec2-sns

2.    根据您的使用案例为主题订阅端点,然后确认订阅。

3.    向 SNS 主题的访问策略添加权限。权限必须允许 EC2 IAM 角色执行 Amazon SNS 的发布 API 操作。

要编辑 SNS 主题访问策略并添加权限,请执行以下操作:

1.    打开 Amazon SNS 控制台

2.    在导航窗格上,选择 Topics(主题),然后选择要发布到的 SNS 主题。

3.    选择 Access policy(访问策略)选项卡。

4.    在主题页面的 Details(详细信息)部分,选择 Edit(编辑)。

5.    展开访问策略部分,然后添加权限以允许 EC2 实例的 IAM 角色 (cross-acc-ec2-sns-publish-role) 发布到 SNS 主题。例如:

{
  "Sid": "grant-65864586-publish",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::111122223333:role/cross-acc-ec2-sns-publish-role"
    ]
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:us-east-2:123456789012:cross-account-ec2-sns"
}

6.    选择 Save changes(保存更改)。

从 EC2 实例发布通知来测试配置

1.    使用您的 EC2 实例登录账户,然后连接到您的 EC2 实例。 对于 Windows 实例,请参阅连接到 Windows 实例。对于 Linux 实例,请参阅连接到 Linux 实例

2.    在 EC2 终端中运行 Amazon SNS 发布命令,然后监控响应。例如,可以在 AWS CLI 中使用测试查询,类似于:

aws sns publish  --topic-arn "arn:aws:sns:us-east-2:123456789012:cross-account-ec2-sns"
    --message "test" --region us-east-2
{
    "MessageId": "c72e7c2f-f95a-5c57-97c5-25448b2a7e71"
}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?