我正在尝试创建一个限制性 SSM 角色 IAM 策略,该策略能够在 SendCommand 命令执行失败时发送 SNS 通知。我目前有以下政策,在没有其他信息的情况下给我“AccessDenied”(已替换占位符):
{
"Statement": {
"Effect": "Allow",
"Action": [ "ssm:SendCommand" ],
"Resource": [
"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:instance/*",
"arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:document/${DocumentName}",
"arn:aws:s3:::${S3BucketName}",
"arn:aws:s3:::${S3BucketName}/*",
"arn:aws:iam::${AWS::AccountId}:role/${RoleThatHasSNSPublishPerms}",
"arn:aws:sns:${AWS::RegionId}:${AWS::AccountId}:${SNSTopicName}"
]
}
}
我还拥有 ${RoleThatHasSNSPublishPerms} 的 iam::PassRole 权限。我以这种方式使用 python boto3 从 lambda 调用它:
ssm = boto3.client('ssm')
ssm.send_command(
InstanceIds = [ instance_id ],
DocumentName = ssm_document_name,
TimeoutSeconds = 300,
OutputS3Region = aws_region,
OutputS3BucketName = output_bucket_name,
OutputS3KeyPrefix = ssm_document_name,
ServiceRoleArn = ssm_service_role_arn,
NotificationConfig = {
'NotificationArn': sns_arn,
'NotificationEvents': ['TimedOut', 'Cancelled', 'Failed'],
'NotificationType': 'Command'
}
)
我知道问题出在我的 IAM 策略的“资源”部分,因为当我将资源块更改为简单的“*”时,运行命令会正确执行。此外,当我删除 python 命令的 NotificationConfig 和 ServiceRoleArn 部分时,SendCommand 也会成功。
我不希望这个 lambda 角色的许可策略只是在任何地方和任何地方执行命令。问题是,我如何限制此策略并仍然发送失败通知?
编辑:不确定这是新的还是我之前错过了它,但 AWS 发布了一些关于如何将权限缩小到仅标记的 EC2 的说明: https ://docs.aws.amazon.com/systems-manager/latest/userguide /sysman-rc-setting-up-cmdsec.html
这仍然不能回答问题的 SNS/S3 部分,但至少这是朝着正确方向迈出的一步。