我正在尝试访问 AWS SSM 参数存储,就像本文一样。我已经在本地测试了lambda函数,它按预期工作。但是,当推送到 AWS 时,lambda 在尝试检索配置时会失败;它超时:
{
"errorMessage": "2018-09-02T04:55:49.096Z 71a5006a-ae6c-11e8-9322-313ba5e28048 Task timed out after 6.01 seconds"
}
我已将以下权限添加到我的serverless.yml
。我已经尽可能不受限制地尝试找到错误所在。此外,该参数只是一个字符串,因此不使用 KMS。
service: pwaer-messages-service
provider:
name: aws
runtime: nodejs8.10
vpc:
securityGroupIds:
- sg-222f126f
subnetIds:
- subnet-756aef12
- subnet-130f8f3d
environment:
NODE_ENV: ${opt:stage, 'dev'}
iamRoleStatements:
- Effect: 'Allow'
Action: 'ssm:**'
Resource:
- 'Fn::Join':
- ':'
-
- 'arn:aws:ssm'
- Ref: 'AWS::Region'
- Ref: 'AWS::AccountId'
- 'parameter/*'
functions:
receiveText:
handler: dist/receive.handler
events:
- http:
path: sms/parse
method: post
我错过了什么?
由于上述 Lambda 无法访问公共互联网,因此要访问 AWS API,请设置 VPC 终端节点。
根据描述 - "VPC 终端节点使您能够私下将 VPC 连接到受支持的 AWS 服务和 VPC 终端节点服务"。
对于 AWS 系统管理器,请遵循此过程 - 为系统管理器设置 VPC 终端节点
如果您的 Lambda 位于 VPC 中,则会发生这种情况。您需要做两件事:
- 将 aws ssm 服务公开为 VPC 终端节点(请参阅 Migdal @Lech答案(
- VPC 终端节点的安全组必须与您希望允许连接的 lambda(或服务(的安全组相关联
- 将端口 443 的自入口规则添加到 lambda 的安全组
CDK 示例
const LambdaSecurityGroupIngressRule = new ec2.CfnSecurityGroupIngress(this, "LambdaSecurityGroupIngressRule", {
groupId: LambdaSecurityGroup.attrGroupId,
sourceSecurityGroupId: LambdaSecurityGroup.attrGroupId,
description: "Needed to connect to parameter store from lambda in VPC",
fromPort: 443,
ipProtocol: "tcp",
toPort: 443
})
LambdaSecurityGroupIngressRule.addDependsOn(S3IndexLambdasSecurityGroup)