Lambda 函数无法访问密钥管理器



我编写了一个lambda函数来访问数据库,所以第一步是从AWS secrets Manager获取机密。我有一个私有的VPC以及与lambda函数相关联的子网、NAT网关和安全组。我还有secretsmanager.Secret.grantRead(lambda_exec_role),所以lambda应该可以访问Secrets Manager。

出于某种原因,当我在API网关中测试它时;errno":"ETIMEDOUT";以及";代码":"NetworkingError";在CloudWatch中。从我在API的打印日志中,获取秘密失败了。

我也尝试在这里为Secrets Manager添加一个VPC端点,但仍然得到了相同的错误。

如果这里有人能帮我或给我一些提示,我将不胜感激。

非常感谢!

我也遇到了lambda获取秘密内容的麻烦。

你可以尝试以下几种方法:

#1确保你有权获得机密值,我会给你我的工作配置:

  • 允许:secretsmanager:GetSecretValue对您的秘密
  • 允许:secretsmanager:描述你的秘密
  • 允许:secretsmanager:ListSecrets在所有资源上

#2我的VPC和子网也有问题。如果处理错误,您将无法调用Secret Manager API。

  • 为您的lambda切换到无VPC,并检查您是否可以获得机密。如果它有效,则表示您的VPC/子网配置有问题
  • 检查您的子网配置:
    • 在公共子网上,您可以为密钥管理器配置一个特定的端点,尽管我无法使其工作,不知道为什么
    • 在私有子网上,您需要配置NAT网关,以便能够调用Secret Manager API

希望有一天它能帮助到别人。:(

如果其他人在解决Secrets Manager lambda扩展的问题时遇到这个问题,我想分享我在使用Nodejs18.x运行时(目前是全新的(实现时的经验。我利用了这个新运行时的新顶级等待,并希望在init(处理程序之外(从SM中检索我的秘密。我所有的尝试都失败了,我收到了来自扩展的响应

尚未准备好提供流量,请等待

将http调用(到扩展的端口(移动到我的处理程序函数内部,立即解决了这个问题

我也遇到了类似的问题,有效的方法是将kms:Decrypt添加到IAM策略中。因为根据AWS的官方文件:

如果使用客户管理的密钥而不是Amazon Web Services管理的密钥aws/secretsmanager加密密钥,那么您还需要该密钥的kms:Decrypt权限。https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_secret_value

Lambda附带的IAM策略应该看起来像:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret",
"secretsmanager:ListSecrets"
],
"Resource": "*"
}
]
}

根据您的需求,您可能希望将Resources限制为更具体的内容。希望它也适用于你。

根据错误的性质-网络超时-我认为即使您有权限,也无法获取机密。

由于您在VPC内处理Lambda,请注意,有两种方法可以将您的Lambda放入VPC:

  • 在公共子网中:在这种情况下,您的Lambda不能访问互联网,因此您唯一的选择是为Secrets Manager配置VPC端点,或者
  • 在私有子网中:在这种情况下,您的私有子网可以将0.0.0.0/0流量路由到NAT网关,然后路由到Internet网关(通过公共子网(。这使您可以选择通过其公共端点(即通过互联网(访问Secrets Manager,或者再次通过VPC端点访问

为了对此表示赞同,我的解决方案需要两个步骤

  • 为Secrets Manager创建一个VPC端点(我在这里遵循了这个过程:https://aws.amazon.com/blogs/security/how-to-connect-to-aws-secrets-manager-service-within-a-virtual-private-cloud/)
  • 正如@frida schenker之前指出的那样,将策略附加到执行人角色

以下是我如何使它在serverless.yml中工作的。

AWS参考:https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-终点

以下yml出现在路径resources.Resources.YourVPCEndpointNameHere:下

# Provides access from the VPC to Secrets Manager
# See https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint
Type: AWS::EC2::VPCEndpoint
Properties:
VpcEndpointType: Interface
ServiceName: com.amazonaws.#{AWS::Region}.secretsmanager
PrivateDnsEnabled: true
# Reference your VPC here
VpcId: !Ref EC2VPC
# Reference your subnet ids here
SubnetIds:
- !Ref EC2SubnetA
- !Ref EC2SubnetB
- !Ref EC2SubnetC
# Reference your security group(s) here
SecurityGroupIds:
- !Ref EC2SecurityGroup

提示:您需要serverless-pseudo-parameters插件才能使#{AWS::Region}正常工作。

最新更新