AWS SSM run command跨区域将输出保存至异区S3存储桶的实现问题
跨区域将AWS SSM命令输出写入异区域S3存储桶解决方案
OutputS3Region参数弃用后,SSM服务会自动根据你传入的S3桶名自动寻址对应区域,输出写入失败通常是权限配置缺失导致,按以下步骤配置即可实现跨区域存储输出:
1. 配置目标S3存储桶策略
在us-west-2的目标S3桶需添加如下桶策略,允许各区域SSM服务主体写入权限,示例如下(替换my-bucket和你的AWS账号ID为实际值):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": [ "s3:PutObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ], "Condition": { "StringEquals": { "aws:SourceAccount": "你的AWS账号ID" } } } ] }
2. 配置EC2实例绑定的IAM角色权限
实例关联的IAM角色必须添加目标S3桶的写入和桶位置查询权限,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } ] }
3. 调整send_command调用参数
不需要额外指定区域参数,可按需添加输出路径前缀、超时时间等配置即可,调整后的Python代码示例:
response = ssm_client.send_command( InstanceIds=[instance_id], DocumentName="AWS-RunShellScript", OutputS3BucketName='my-bucket', OutputS3KeyPrefix='ssm-command-output/', # 可选,自定义S3内的存储路径前缀 Parameters={'commands': [cmd], 'executionTimeout': ['7200']} # 命令执行时间较长时可调整超时时间 )
4. 常见排查项
- 升级实例上的SSM Agent到最新版本,旧版本存在跨区域S3写入的兼容性问题
- 若目标S3桶开启了KMS加密,需要同时给SSM服务主体和实例IAM角色授予对应KMS密钥的
kms:Decrypt、kms:GenerateDataKey权限 - 检查S3桶是否存在其他拦截写入的策略,排除权限冲突
内容的提问来源于stack exchange,提问作者Yael
相关产品推荐
相关产品推荐

