[英]Assumed role in AWS Lambda, access denied on SSM call
我在调用 SSM 的 Lambda function 中收到错误消息:
AccessDeniedException:用户:arn:aws:sts::redacted:assumed-role/LambdaBackend_master_lambda/SpikeLambda 无权执行:资源上的 ssm:GetParameter:arn:aws:ssm:eu-west-1:redacted:parameter/default/密钥/API
但是,我很确定我配置正确:
角色,AssumeRole 为 Lambda(尽管我们从错误消息中知道它有效)。
λ aws iam get-role --role-name LambdaBackend_master_lambda
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
]
},
"RoleId": "redacted",
"CreateDate": "2017-06-23T20:49:37Z",
"RoleName": "LambdaBackend_master_lambda",
"Path": "/",
"Arn": "arn:aws:iam::redacted:role/LambdaBackend_master_lambda"
}
}
我的政策:
λ aws iam list-role-policies --role-name LambdaBackend_master_lambda
{
"PolicyNames": [
"ssm_read"
]
}
λ aws iam get-role-policy --role-name LambdaBackend_master_lambda --policy-name ssm_read
{
"RoleName": "LambdaBackend_master_lambda",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ssm:DescribeParameters"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"ssm:GetParameters"
],
"Resource": "arn:aws:ssm:eu-west-1:redacted:parameter/*",
"Effect": "Allow"
}
]
},
"PolicyName": "ssm_read"
}
我已经通过策略模拟器运行它,它似乎没问题!
今天玩这个并得到以下内容,从ssm:GetParameters
删除 s 并使用ssm:GetParameter
在使用 GetParameter 操作时似乎可以工作。 即AWS_PROFILE=pstore aws ssm get-parameter --name param_name
。 这weirded我出去了一下,因为我无法找到这在所有在IAM行动文档 在这里。 但是它似乎确实有效,并且 ssm 的文档记录仍然不足。 亚马逊已经更新并移动了它的文档。 新文档包含ssm:GetParameters
和ssm:GetParameter
。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ssm:DescribeParameters"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"ssm:GetParameter"
],
"Resource": "arn:aws:ssm:eu-west-1:redacted:parameter/*",
"Effect": "Allow"
}
]
}
就我而言(我使用 AWS SDK for Go V2),我需要ssm:GetParametersByPath
和ssm:GetParameter
才能使其工作。
今天遇到了同样的错误。 以下 Java 代码在encrypted = false
和paramName
引用未加密参数时导致它
GetParameterRequest request = new GetParameterRequest()
.withName(paramName)
.withWithDecryption(encrypted);
GetParameterResult resultPacket = ssmClient.getParameter(request);
修复方法是在不设置WithDecryption
标志的情况下创建未加密的参数请求 - GetParameterRequest request = new GetParameterRequest().withName(paramName);
这实际上取决于您在 Lambda 中使用的命令。
如果您使用boto3.client('ssm').get_parameters(Names=[param1, param2])
,那么您需要"Action": ["ssm:GetParameters"]
,
或者,当您使用boto3.client('ssm').get_parameter(Name=param)
,您需要"Action": ["ssm:GetParameter"]
就我而言,我使用的是s3:GetObject
和s3:ListBucket
。 为了解决这个错误,我不得不在资源中两次添加存储桶,并在其中一个附加一个*
。 例如:
{
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"s3:GetObject",
"s3:ListBucket",
],
"Resource" : [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket",
]
},
]
}
关于混淆 ssm:GetParameter 和 ssm:GetParameters。 我将策略 AmazonEC2RoleforSSM 附加到某些用户并遇到了同样的问题,“未授权执行:ssm:GetParameter”,因为该策略只有 ssm:GetParameters。 AWS 对该政策附加了弃用警告,并建议改用 AmazonSSMManagedInstanceCore,它同时具有操作 ssm:GetParameters 和 ssm:GetParameter。 然后工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.