使用 AWS Golang SecretsManager 缓存客户端的 AWS Lambda 函数的正确资源权限是什么?

What are the correct resource permissions for AWS Lambda functions using AWS Golang SecretsManager Caching client?

我们目前有 AWS lambda 函数使用以下 AWS 秘密资源权限从 AWS 秘密管理器检索秘密(lambda 函数和秘密属于同一个 AWS 账户):

{
  "Version" : "2012-10-17",
  "Statement" : [ {
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111111111111:role/MyLambda-FunctionNameRole-1TG1EVGPEQ8TZ"
    },
    "Action" : "secretsmanager:GetSecretValue",
    "Resource" : "*",
    "Condition" : {
      "ForAnyValue:StringEquals" : {
        "secretsmanager:VersionStage" : "AWSCURRENT"
      }
    }
  } ]
}

由于更频繁的秘密查找,我想使用 AWS Go SecretsManager Caching 添加秘密缓存,但收到以下错误消息:

AccessDeniedException: User: arn:aws:sts::111111111111:assumed-role/MyLambda-FunctionName-DNV2M7OYIFMX/MyLambda-FunctionName-eoFcAmXLBOV1 is not authorized to perform: secretsmanager:DescribeSecret on resource: secrets_key_name

秘密 arn 前缀是:

arn:aws:secretsmanager:us-east-1

创建缓存管理器的代码:

session := session.Must(session.NewSession(aws.NewConfig().WithRegion("us-east-1")))
secretCache, _ := secretcache.New(
        func(c *secretcache.Cache) {
            c.Client = secretsmanager.New(session)
        },
    )

以及检索秘密的代码:

secretCache.GetSecretString(secrets_key_name)

我尝试将 secretsManager:DescribeSecret 添加到秘密资源权限中的操作,以及更改为 secretsManager:*,但我仍然收到错误消息。我怀疑这与

有关

arn:aws:sts::111111111111:assumed-role

但我不确定为什么要请求一个假定的角色(有问题的 lambda 函数和秘密都属于同一个 aws 帐户)或如何修复它。非常感谢任何帮助!

编辑:通过不设置秘密 VersionStage,我能够直接使用 SecretsManager API(没有缓存客户端)产生类似的错误消息,尽管文档指出不指定应该像使用一样“AWSCURRENT”,这是需要的。认为它可能相似,我将缓存客户端代码切换为以下代码,但仍然收到相同的错误:

secretCache.GetSecretStringWithStage(secrets_key_name, "AWSCURRENT")

事实证明,这显然与此 issue 中提到的相似 - 从秘密资源策略中删除条件修复它:

 {
      "Version" : "2012-10-17",
      "Statement" : [ {
        "Effect" : "Allow",
        "Principal" : {
          "AWS" : "arn:aws:iam::redacted:role/MyLambdaFunctionNameRole-DNV2M7OYIFMX"
        },
        "Action" : "secretsmanager:GetSecretValue",
        "Resource" : "*"
    }

我不确定为什么调用 GetSecretStringWithStage("my_secret_name","AWSCURRENT") 没有像将 VersionStage 添加到 SecretsManager API 调用那样解决问题...但那是另一天的事。

感谢 LRutten 帮助解决这个问题!