如何配置 AWS Systems Manager Run Command 以将输出发送到其他 AWS 账户中的 S3 存储桶?

2 分钟阅读
0

我想将 AWS Systems Manager Run Command 输出发送到其他 AWS 账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。该如何操作?

解决方法

您可以使用 AWS Systems Manager Run Command 在托管的实例中运行 Systems Manager 文档,例如 AWS-RunPatchBaselineAWS-RunPowerShellScript。然后,您可以将输出发送到同一 AWS 账户中的 Amazon CloudWatch 和 Amazon S3,或发送到其他 AWS 账户中的 S3 存储桶。

要允许 Systems Manager 访问其他 AWS 账户中的 S3 存储桶,请配置以下 AWS Identity and Access Management (IAM) 和存储桶策略。

IAM 实例配置文件的权限

实例配置文件是在启动时将 IAM 角色信息传递给 Amazon Elastic Compute Cloud (Amazon EC2) 实例的容器。附加到您的托管 EC2 实例的 IAM 角色必须执行以下操作才能允许访问 S3 存储桶。将 DOC-EXAMPLE-BUCKET 替换为目标账户中的 S3 存储桶名称。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

有关特定场景所需的 S3 权限的更多信息,请参阅创建自定义策略以访问 S3 存储桶

目标 S3 存储桶策略

目标 S3 存储桶必须允许附加到托管的 EC2 实例的实例配置文件角色访问该存储桶。您可以创建存储桶策略,也可以在存储桶访问控制列表 (ACL) 中授予对源 AWS 账户的访问权限。

警告:创建存储桶策略是安全最佳实践。如果您将源 AWS 账户添加到存储桶 ACL,则将允许源 AWS 账户中的所有用户和角色访问该 S3 存储桶。

以下是目标 S3 存储桶的示例存储桶策略。将 DOC-EXAMPLE-BUCKET 替换为目标账户中的 S3 存储桶名称。将 SOURCE-AWS-ACCOUNT 替换为源 AWS 账户 ID。将实 INSTANCE-PROFILE-ROLE-NAME 替换为附加到该 EC2 实例的 IAM 角色名称。

{
  "Version": "2012-10-17",
  "Id": "Policy1589684413780",
  "Statement": [
    {
      "Sid": "Stmt1589684412557",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::SOURCE-AWS-ACCOUNT:role/INSTANCE-PROFILE-ROLE-NAME"
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

配置 Run Command 以将命令输出发送到 Amazon S3

AWS Systems Manager 控制台

1.    打开 Systems Manager 控制台,然后从导航窗格中选择 Run Command

2.    选择 Run Command

3.    选择要运行的文档,然后输入所有需要的参数。

4.    对于 Output Options(输出选项),选择 Enable an S3 bucket(启用 S3 存储桶)。选择 Enter an S3 bucket name in the text box(在文本框中输入 S3 存储桶名称),然后输入目标账户中 S3 存储桶的名称。

5.    (可选)要将命令输出发送到 S3 存储桶的子文件夹,请为 S3 key prefix(S3 密钥前缀)输入 S3 密钥前缀。

AWS CLI

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

在 AWS CLI 中运行 SendCommand API 调用时,可以通过添加以下参数来指定输出选项:

--output-s3-bucket-name "DOC-EXAMPLE-BUCKET" --output-s3-key-prefix "DOC-EXAMPLE-BUCKET-PREFIX"

注意:在上述参数示例中,DOC-EXAMPLE-BUCKET 是目标账户中 S3 存储桶的名称。DOC-EXAMPLE-BUCKET-PREFIX 指示 S3 存储桶中要用于存储响应的子文件夹。将命令输出发送到 S3 存储桶时不需要 output-s3-key-prefix 参数。有关更多信息,请参阅 send-command

以下 AWS CLI 示例启动的命令使用 AWS-RunPowerShellScript 文档在标记为 Key=tag:Env,Values=Dev,Test 的托管实例中远程运行 echo helloWorld。命令输出将发送到目标账户中名为 DOC-EXAMPLE-BUCKET 的 S3 存储桶,并存储在名称前缀为 DOC-EXAMPLE-BUCKET-PREFIX 的子文件夹中。

aws ssm send-command --document-name "AWS-RunPowerShellScript" --parameters '{"commands":["echo helloWorld"]}'  --targets '[{"Key":"tag:Env","Values":["Dev","Test"]}]' --output-s3-bucket-name "DOC-EXAMPLE-BUCKET" --output-s3-key-prefix "DOC-EXAMPLE-BUCKET-PREFIX"

相关信息

为 Systems Manager 创建 IAM 实例配置文件

AWS 官方
AWS 官方已更新 2 年前