创建没有资源的 CloudFormation 堆栈
Posted
技术标签:
【中文标题】创建没有资源的 CloudFormation 堆栈【英文标题】:Create CloudFormation stack without resources 【发布时间】:2020-11-09 10:12:18 【问题描述】:我的大部分基础架构都使用 Terraform,但同时我使用 serverless framework 来定义一些 Lambda 函数。 Serverless 在后台使用 CloudFormation,我需要访问一些 ARN 以获取 Terraform 创建的资源。
我的想法是在 Terraform 中创建一个 CloudFormation 堆栈并导出我需要的所有值,但它抱怨它无法在没有任何资源的情况下创建堆栈。我不想在 CloudFormation 中定义任何资源,只定义输出,所以我虽然可能有一种方法可以定义一些虚拟资源,但我找不到。
有没有办法解决这个问题?如果没有,我也愿意接受其他有关将参数从 Terraform 传递到 CloudFormation 的建议。
【问题讨论】:
【参考方案1】:资源部分是必需的,但您可以创建非资源类型的资源。
例如,只有 非资源 的极简模板将是:
Conditions:
Never:
!Equals [ "A", "B" ]
Resources:
NonResource:
Type: Custom::NonResource
Condition: Never
Outputs:
MyOutput:
Value: some-value
【讨论】:
【参考方案2】:您可以为此使用AWS::CloudFormation::WaitConditionHandle。示例:
Resources:
NullResource:
Type: AWS::CloudFormation::WaitConditionHandle
【讨论】:
【参考方案3】:CloudFormation 堆栈需要至少一种资源(毕竟 CloudFormation 的目的是以编程方式部署资源)。
CloudFormation 支持parameters,您可以将其传递到堆栈中。
在 Terraform 中,您可以使用这些 parameters,如下例所示。
resource "aws_cloudformation_stack" "network"
name = "networking-stack"
parameters =
VPCCidr = "10.0.0.0/16"
template_body = <<STACK
"Parameters" :
"VPCCidr" :
"Type" : "String",
"Default" : "10.0.0.0/16",
"Description" : "Enter the CIDR block for the VPC. Default is 10.0.0.0/16."
,
"Resources" :
"myVpc":
"Type" : "AWS::EC2::VPC",
"Properties" :
"CidrBlock" : "Ref" : "VPCCidr" ,
"Tags" : [
"Key": "Name", "Value": "Primary_CF_VPC"
]
STACK
在 GitHub 上有一篇关于使用 serverless framework with Terraform 和一些 examples 的帖子,说明如何设置它。
【讨论】:
问题是无服务器 cloudformation 模板是从它的自定义配置生成的,我无法直接将参数从 terraform 传递给它。 SSM 方式可能会起作用,但我发现@Marcin 提供的答案更简单。 抱歉,@TheEdgeOfRage 无法提供更多帮助,尽管您应该查看这篇文章。这是无服务器倾向于推荐使用 Terraform 的方式以上是关于创建没有资源的 CloudFormation 堆栈的主要内容,如果未能解决你的问题,请参考以下文章
如何从 aws cloudformation 模板为特定资源类型创建堆栈
当自定义命名资源需要替换时,CloudFormation 无法更新堆栈