承担AWS Lambda中的角色,在SSM调用中拒绝访问

时间:2017-06-24 08:42:24

标签: amazon-web-services amazon-iam

我的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"
}

我通过策略模拟器运行它似乎很好!

AWS IAM policy sim

4 个答案:

答案 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 = falseparamName引用未加密的参数时,以下Java代码导致了该问题

    GetParameterRequest request = new GetParameterRequest()
        .withName(paramName)
        .withWithDecryption(encrypted);
    GetParameterResult resultPacket = ssmClient.getParameter(request);

修复是在不设置WithDecryption标记的情况下创建未加密的参数请求 - GetParameterRequest request = new GetParameterRequest().withName(paramName);