在没有资源的情况下创建CloudFormation堆栈

时间:2020-07-20 07:37:25

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

我在大多数基础架构中都使用Terraform,但与此同时,我在使用serverless framework定义了一些Lambda函数。 Serverless在需要使用Terraform创建的资源的某些ARN的情况下使用CloudFormation。

我的想法是在Terraform中创建一个CloudFormation堆栈并导出我需要的所有值,但是它抱怨说如果没有任何资源就无法创建堆栈。我不想在CloudFormation中定义任何资源,仅在输出中定义,所以我虽然也许可以定义一些虚拟资源,但是我找不到任何资源。

是否有解决此问题的方法?如果没有,我也愿意接受其他建议,以获取将参数从Terraform传递到CloudFormation的方法。

3 个答案:

答案 0 :(得分:2)

“资源”部分是必需的,但是您可以创建非资源类型的资源。

例如,仅具有非资源的极简主义模板为:

Conditions:

  Never:
    !Equals [ "A", "B" ]

Resources:

  NonResource:
    Type: Custom::NonResource
    Condition: Never

Outputs:
  
  MyOutput:
    Value: some-value
  

答案 1 :(得分:1)

您可以为此使用AWS::CloudFormation::WaitConditionHandle。示例:

Resources:
  NullResource:
    Type: AWS::CloudFormation::WaitConditionHandle

答案 2 :(得分:0)

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的文章。