我的Lambda函数出错,调用SSM:
AccessDeniedException:User:arn:aws:sts :: redacted:assume-role / LambdaBackend_master_lambda / SpikeLambda无权执行:ssm:资源上的GetParameter:arn:aws:ssm:eu-west-1:redacted:parameter /默认/键/ API
但是,我很确定我正确配置了这个:
角色,使用AssumeRole for 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"
}
我通过策略模拟器运行它似乎很好!
答案 0 :(得分:21)
今天玩了这个并获得了以下内容,从ssm:GetParameters
删除s并使用ssm:GetParameter
似乎在使用GetParameter操作时起作用。即AWS_PROFILE=pstore aws ssm get-parameter --name param_name
这让我有点意外,因为我在iam行动文档here中找不到这一点。然而它似乎确实有效,而ssm仍然有点记录在案。
{
"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"
}
]
}
答案 1 :(得分:5)
就我而言(我使用适用于Go V2的AWS开发工具包),我同时需要ssm:GetParametersByPath
和
ssm:GetParameter
以使其正常运行。
答案 2 :(得分:1)
这实际上取决于您在 Lambda 中使用的命令。
如果你使用boto3.client('ssm').get_parameters(Names=[param1, param2])
,那么你需要"Action": ["ssm:GetParameters"]
,
或者当您使用 boto3.client('ssm').get_parameter(Name=param)
时,您需要 "Action": ["ssm:GetParameter"]
答案 3 :(得分:0)
今天遇到同样的错误。当encrypted = false
和paramName
引用未加密的参数时,以下Java代码导致了该问题
GetParameterRequest request = new GetParameterRequest()
.withName(paramName)
.withWithDecryption(encrypted);
GetParameterResult resultPacket = ssmClient.getParameter(request);
修复是在不设置WithDecryption
标记的情况下创建未加密的参数请求 - GetParameterRequest request = new GetParameterRequest().withName(paramName);