我尝试创建限制性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部分,但至少它朝着正确的方向迈出了一步。