首页 > 解决方案 > lambda 轮换函数中的 AWS SecretsManager list_secret_version_ids 返回 AccessDeniedException

问题描述

我正在编写一个自定义 lambda 函数来实现用于 SecretsManager 的通用旋转密钥算法。

在我的 pycharm IDE 中本地运行时,python lambda 函数可以完美运行,但是,当我将其粘贴到 lambda 控制台并部署它时,在 SecretsManager 中执行“立即轮换密钥”时会收到 AccessDeniedException。违规代码是:

 resp = service_client.list_secret_version_ids(SecretId=arn, IncludeDeprecated=True)

登录用户位于附加了 AdministratorAccess 策略的组中。我还为踢球添加了 SecretsManagerReadWrite 策略。

我打印了一条错误消息,其中包含秘密的 arn 并且它是正确的。在“正常”代码完成后,从 finishSecret 方法调用此代码,因此密钥确实可以正常旋转。但是,我添加了自定义代码以确保将版本保留 2 年(通过分配版本阶段,以便 SM 不会删除它们)。为此,我需要 list-secret-version-ids 方法。

从 SecretsManager 调用此函数时是否有某种限制?

有任何想法吗?

标签: aws-lambdaaws-secrets-managerkey-rotation

解决方案


我解决了这个问题。显然,当我创建它时分配给 lambda 函数的默认 IAM 角色不包括运行 ListSecretversionIds 方法的权限。我按照 AWS SecretsManager 用户指南(从第 84 页开始)中标题为“使用 AWS Serverless Application Repository 模板创建 Lambda 轮换函数”的部分进行操作。

因此,要添加权限,请执行以下操作:

1. Bring up the lambda function just created 
2. Click the Permissions tab
3. Click the role that was assigned (at top of page)
4. On the Permissions tab (already displayed)
    1. Click Show 2 more
    2. Open SecretsManagerRotationTemplateRolePolicy1
    3. Click [Edit Policy] button
    4. Click [JSON] 
    5. Add "secretsmanager:ListSecretVersionIds” to the list of Actions allowed so it looks like:
            "Action": [ 
                "secretsmanager:DescribeSecret",
                "secretsmanager:GetSecretValue",
                "secretsmanager:PutSecretValue",
                "secretsmanager:UpdateSecretVersionStage",
                "secretsmanager:ListSecretVersionIds"
            ],
    6. Click [Review...]
    7. Click [Save Changes]

或者,如果您对编辑 JSON 感到不安,您可以改用 Visual Editor 选项卡上的交互式方法。


推荐阅读