我在尝试将 AWS CloudFormation 输出中的值导入到无服务器框架内的 Lambda 函数时遇到问题。我的目标是通过导出默认子网 ID 并将其导入到 Lambda 配置中,在 Lambda 函数中使用默认 VPC 网络。
在我的 CloudFormation 模板中,我设置了默认子网 ID 的参数并将这些值导出为输出。这是我所做的一个片段:
Parameters:
DefaultPrivateSubnetIds:
Type: String
Default: subnet-******
DefaultPrivateSubnetIds2:
Type: String
Default: subnet-******
Output:
PrivateSubnet1:
Description: "Value of the first private subnet"
Value: !Ref DefaultPrivateSubnetIds
Export:
Name: !Sub ${Environment}-DefaultPrivateSubnetId
PrivateSubnet2:
Description: "Value of the second private subnet"
Value: !Ref DefaultPrivateSubnetIds2
Export:
Name: !Sub ${Environment}-DefaultPrivateSubnetId2
但是,当尝试将这些值导入到无服务器 YAML 文件中的 Lambda 函数的 VPC 配置时,我遇到了错误:
getDischarge:
vpc:
securityGroupIds:
- ${env:DEFAULT_SG_RDS,'sg-40f6450e'}
subnetIds:
- ${env:SUBNET_A, Fn::ImportValue: ${self:provider.stage}-PrivateSubnet1}
- ${env:SUBNET_B, Fn::ImportValue: ${self:provider.stage}-PrivateSubnet2}
CloudFormation 控制台中报告的错误是:
module.<>_backend.null_resource.this (local-exec): at 'functions.getDischarge.vpc.securityGroupIds.0': unsupported object format
module.<>_backend.null_resource.this (local-exec): at 'functions.getDischarge.vpc.subnetIds.0': unsupported object format
目前我通过提供硬编码值直接修复了它,但代码看起来并不专业,所以我需要一种方法以正确的格式提供这些值。
我怀疑该问题可能与导出值的格式或我在无服务器配置中引用它们的方式有关。根据我的研究,CloudFormation 默认将值导出为字符串。但是,我不确定我的无服务器 YAML 文件是否正确引用了这些值。
如何将这些导出的值正确导入到无服务器框架内的 Lambda 函数的 VPC 配置中?导出的值是否应该采用不同的格式以便在无服务器配置中正确引用?
对我的方法的任何指导或更正将不胜感激。 谢谢!
使用不同堆栈的输出作为配置一部分的最常见方法是使用
cf
变量源,如下所述:https://www.serverless.com/framework/docs/providers/aws/guide/变量#reference-cloudformation-outputs
您看到的错误是由于无服务器框架似乎无法解析subnetId 的环境变量而引起的。如果运行
sls print
,您将看到为 subnetIds
解析的值不是您期望的值。一般来说,将变量分辨率默认为对象可能有点棘手,这就是为什么我建议直接使用 cf
变量源,这似乎很好地涵盖了您的情况。