我编写了一个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}
正常工作。