【问题标题】:Create CloudFormation stack without resources创建没有资源的 CloudFormation 堆栈
【发布时间】:2020-11-09 10:12:18
【问题描述】:

我的大部分基础架构都使用 Terraform,但同时我使用 serverless framework 来定义一些 Lambda 函数。 Serverless 在后台使用 CloudFormation,我需要访问一些 ARN 以获取 Terraform 创建的资源。

我的想法是在 Terraform 中创建一个 CloudFormation 堆栈并导出我需要的所有值,但它抱怨它无法在没有任何资源的情况下创建堆栈。我不想在 CloudFormation 中定义任何资源,只定义输出,所以我虽然可能有一种方法可以定义一些虚拟资源,但我找不到。

有没有办法解决这个问题?如果没有,我也愿意接受其他有关将参数从 Terraform 传递到 CloudFormation 的建议。

【问题讨论】:

    标签: amazon-web-services terraform amazon-cloudformation serverless-framework


    【解决方案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 的方式
        猜你喜欢
        • 2021-07-06
        • 2021-04-22
        • 1970-01-01
        • 2022-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 2016-03-10
        相关资源
        最近更新 更多