具有当前CFT变量的AWS Cloudformation模板

时间:2017-04-26 16:09:24

标签: amazon-web-services amazon-s3 amazon-cloudformation

在应用新的更改集模板时,我很难弄清楚如何使用当前堆栈中的值。可以想象,重新应用新集合需要堆栈的许多当前配置参数。但是,我无法找到关于如何执行此操作的权威文档。

到目前为止,我正在看这样的事情。

  "DomainName": {
    "Value": {"Ref": "AWS::S3::Bucket::DomainName"}
  }

我希望更改集生成器使用此Ref值来获取已配置的S3存储桶的当前域名。

也许这不是改变集的工作方式?我认为配置在运行时与先前的配置合并,所以你应该可以访问一些以前的实例变量?

感谢。

1 个答案:

答案 0 :(得分:1)

您在CloudFormation模板中定义的内容称为Resources。 资源示例如下:

  • AWS :: S3 ::铲斗
  • AWS :: EC2 ::实例
  • AWS :: EC2 :: VPC

在CloudFormation模板中声明它们时,您定义的每个资源都有Properties。我们以AWS::S3::Bucket资源为例。

{
  "Resources" : {

    "MyBucket" : {
      "Type" : "AWS::S3::Bucket",
      "Properties" : {
        "BucketName" : "my-bucket-name"
      }
    }

  }
}

BucketName是“MyBucket”资源的属性。

资源通常也有Return Values。您可以在CloudFormation模板中使用返回值来构建交叉引用逻辑和资源之间的关系。每个资源通常都有一个“默认”返回值,当您使用模板中的Ref内部函数引用某个资源时,将返回此值。如果是AWS::S3::Bucket资源,则此“默认”返回值只是BucketName。这意味着,如果您希望在模板中的其他位置使用my-bucket-name,则可以在Ref资源上使用MyBucket内在函数。例如,我们可以创建AWS::S3::BucketPolicy资源,BucketName(实际上Bucket)是AWS::S3::BucketPolicy的属性之一。那我们就这样做:

{
  "Resources" : {

    "MyBucket" : {
      "Type" : "AWS::S3::Bucket",
      "Properties" : {
        "BucketName" : "my-bucket-name"
      }
    },

    "MyBucketPolicy" : {
      "Type" : "AWS::S3::BucketPolicy",
      "Properties" : {
        "Bucket" : { "Ref" : "MyBucket" },
        "PolicyDocument" : JSON_STRUCTURE_SKIPPED_FOR_CLARITY
      }
    }

  }
}

请注意,我没有在"Bucket" : "my-bucket-name",资源中写MyBucketPolicy,我实际上想在那里引用MyBucket。 我部署模板时,CloudFormation引擎会将{ "Ref" : "MyBucket" }值替换为"my-bucket-name"

某些资源提供额外的Return Values(属性),可以使用Fn::GetAtt内在函数访问这些值。 AWS::S3::Bucket额外的返回值/属性是:

  • 域名
  • DualStackDomainName
  • WebsiteURL

Fn::GetAtt内在函数的语法如下所示:

{ "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }

要从DomainName资源获取"AWS::S3::Bucket,您可以这样做:

{ "Fn::GetAtt" : [ "MyBucket", "DomainName" ] }

您可以在CloudFormation堆栈输出部分中使用DomainName。完整示例如下:

{
  "Resources" : {

    "MyBucket" : {
      "Type" : "AWS::S3::Bucket",
      "Properties" : {
        "BucketName" : "my-bucket-name"
      }
    },

    "MyBucketPolicy" : {
      "Type" : "AWS::S3::BucketPolicy",
      "Properties" : {
        "Bucket" : { "Ref" : "MyBucket" },
        "PolicyDocument" : JSON_STRUCTURE_SKIPPED_FOR_CLARITY
      }
    }

  },

  "Outputs" : {

    "MyBucketDomainName" : {
      "Description" : "Domain name of my bucket",
      "Value" : { "Fn::GetAtt" : [ "MyBucket", "DomainName" ] }
    }
  }
}

您可以在{{3>中找到有关所有ResourcesPropertiesReturn Values(这些可通过Ref以及Fn::GetAtt功能访问)的信息}}

希望这有帮助!