在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问
Posted
技术标签:
【中文标题】在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问【英文标题】:Assumed role in AWS Lambda, access denied on SSM call 【发布时间】:2017-11-27 19:25:25 【问题描述】:我在调用 SSM 的 Lambda 函数中遇到错误:
AccessDeniedException:用户:arn:aws:sts::redacted:assumed-role/LambdaBackend_master_lambda/SpikeLambda 无权执行:ssm:GetParameter on resource:arn:aws:ssm:eu-west-1:redacted:parameter /default/key/api
但是,我很确定我的配置正确:
角色,与 Lambda 的 AssumeRole(尽管我们知道从错误消息中可以工作)。
λ 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 的错误。当我使用boto3.client('ssm').get_parameter()
时,lambda 权限按预期工作,但我收到您在使用boto3.client('ssm').get_parameters()
时提到的权限错误。
【参考方案1】:
今天玩了这个,得到了以下结果,从ssm:GetParameters
中删除 s 并使用 ssm:GetParameter
似乎在使用 GetParameter 操作时有效。即AWS_PROFILE=pstore aws ssm get-parameter --name param_name
。 这让我有点奇怪,因为我在 iam 操作文档 here 中根本找不到这个。然而,它似乎确实有效,而且 ssm 的文档仍然有点不足。
亚马逊已经更新并移动了它的文档。新的docs 包括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"
]
【讨论】:
记录不足,但仍然比我使用的某些软件记录得更好!谢谢! 将此策略附加到运行 Lambda 的角色为我解决了这个问题。 我有Action: ["ssm:GetParametersByPath", "ssm:GetParameters", "ssm:GetParameter"]
,但它失败了。删除前两个并只留下 "ssm:GetParameter"
后,我得到了它的工作【参考方案2】:
就我而言(我使用 AWS SDK for Go V2),我需要 ssm:GetParametersByPath
和
ssm:GetParameter
让它工作。
【讨论】:
谢谢,只有这对我有帮助。标准错误消息令人困惑。【参考方案3】:今天遇到了同样的错误。当encrypted = false
和paramName
引用未加密的参数时,以下Java 代码会导致此问题
GetParameterRequest request = new GetParameterRequest()
.withName(paramName)
.withWithDecryption(encrypted);
GetParameterResult resultPacket = ssmClient.getParameter(request);
解决方法是在不设置 WithDecryption
标志的情况下创建未加密的参数请求 - GetParameterRequest request = new GetParameterRequest().withName(paramName);
【讨论】:
【参考方案4】:这实际上取决于您在 Lambda 中使用的命令。
如果你使用boto3.client('ssm').get_parameters(Names=[param1, param2])
,那么你需要"Action": ["ssm:GetParameters"]
,
或者当你使用boto3.client('ssm').get_parameter(Name=param)
时,你需要"Action": ["ssm:GetParameter"]
【讨论】:
【参考方案5】:就我而言,我使用的是s3:GetObject
和s3:ListBucket
。为了解决这个错误,我必须在资源中添加两次存储桶,并在其中一个上附加一个*
。例如:
"Statement" : [
"Effect" : "Allow",
"Action" : [
"s3:GetObject",
"s3:ListBucket",
],
"Resource" : [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket",
]
,
]
【讨论】:
以上是关于在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问的主要内容,如果未能解决你的问题,请参考以下文章
principal states.amazonaws.com 无权担任提供的角色