创建没有资源的 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 嵌套堆栈名称

AWS CloudFormation 创建堆栈与部署

当自定义命名资源需要替换时,CloudFormation 无法更新堆栈

CloudFormation 能否在构建堆栈后填充资源或依赖项?

cloudformation 未创建某些资源