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

上次更新时间:2021 年 4 月 20 日

我想将 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) 和存储桶策略。

托管的 EC2 实例 IAM 实例配置文件角色

附加到托管的 Amazon Elastic Compute Cloud (Amazon 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"

这篇文章对您有帮助吗?


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