动态将来源/缓存行为添加到现有CloudFront发行版

时间:2019-03-12 19:56:10

标签: amazon-cloudfront terraform terraform-provider-aws

我相信我在AWS apiaws_cloudfront_distribution模块(版本v0.11)中都遇到了限制。我要完成的工作是动态动态地将起源和缓存行为添加到现有CloudFront发行版中。

我知道这可以通过AWS CLI实现。下面显示了一个示例(从update-distribution documentation中拉出。我的问题与如何使用terraform简化实现的方式有关(如代码段所示)。

$ JSON_OUTPUT=$(aws cloudfront get-distribution-config --id=<MY-DISTROS-ID>)
$ echo $JSON_OUTPUT
{
  "ETag": "E2ABCDEFGHIJKL",
  "DistributionConfig": {
    "CacheBehaviors": {
      "Quantity": 0
    },
    "Origins": {
      "Items": [
        {
          ...origin-info-for-default-cache-behavior
        }
      ],
      "Quantity": 1
    },
    "Enabled": true,
    "DefaultCacheBehavior": {
      ...default-cache-behavior
    },
    ...more-cloudfront-stuff
}
$ # remove the ETag
$ # add an entry to the DistributionConfig.Origins.Items array
$ # add an array of Items to the DistributionConfig.CacheBehaviors.Items = [{ the cache behavior }] and set Quantity = 1
$ # save DistributionConfig key value to a file file:///tmp/new-distro-config.json
$ aws cloudfront update-distribution --id <MY-DISTROS-ID> --distribution-config file:///tmp/new-distro-config.json --if-match E2ABCDEFGHIJKL

这将成功向现有CloudFront发行版中添加新的缓存行为和来源。

我想使用terraform来实现相同的最终目标,以便可以在S3中保持状态。因此,例如,使用Terraform,我会

  • 构建Cloudfront发行版
  • 来自另一个Terraform模块
    • 使用数据块导入Cloudfront发行版
    • 添加一次性缓存行为和来源

在伪代码地形中,为了更加清楚,下面的代码块进一步说明了这一点

# original CloudFront distro
resource "aws_cloudfront_distribution" "my-distro" {
  aliases = ["${var.my_alias_domain}"]

  origin {
    ...origin-info-for-default-cache-behavior
  }

  enabled = true

  default_cache_behavior {
    ...default-cache-behavior
  }

  ...more-cloudfront-stuff

}

然后在另一个terraform模块中(以及将来的某个时间),将产生一些效果

data "terraform_remote_state" "CloudFront" {
  backend = "s3"

  config {
    acl    = "bucket-owner-full-control"
    bucket = "${var.CloudFront_BUCKET}"
    key    = "${var.CloudFront_KEY}"
    region = "${var.CloudFront_REGION}"
  }
}

resource "aws_cloudfront_distribution_origin" "next-origin" {
  cloudfront_distribution_id = "${data.terraform_remote_state.CloudFront.id}"

  origin {
    ...origin-info-for-default-cache-behavior
  }

  ordered_cache_behavior {
    ...origin-info-for-cache-behavior
  }
}

我很清楚aws_cloudfront_distribution_origin不是Terraform中的资源。我只是在编写此伪代码来传达我要完成的工作。这是一个实际的用例,用于分解应该全部驻留在同一域下的服务。

全部内容写完后,我假设在这种情况下我应该只放弃terraform来代替AWS CLI。但是,如果其他人使用terraform完成了此任务,我很想听听这是怎么可能的。

2 个答案:

答案 0 :(得分:0)

答案是,这对于terraform v0.11是不可能的(据我所知,否则仍然可以接受建议)。我试图通过设置 h, w = plt.figaspect(1) fig = plt.figure(figsize = (h, w)) grid = fig.add_gridspec(nrows = 2, ncols = 2, hspace = 0, wspace = 0, width_ratios = [2, 1], height_ratios = [1, 2]) ax = fig.add_subplot(grid[1,0]) ay = fig.add_subplot(grid[0,0], sharex = ax) az = fig.add_subplot(grid[1,1], sharey = ax) plt.setp(ay.get_xticklabels(), visible = False) plt.setp(az.get_yticklabels(), visible = False) # Add this for square image ax.set_aspect('equal') 属性来动态增加origin / ordered_cache_behavior参数。类似于以下内容

count

然后我遇到一个问题,即variable "s3_buckets_info" { type = "list" description = "S3 buckets information" default = [{ domain_name = "this.is.a.domain.com" app = "this.is.the.app" env = "this.is.the.env" path = "/match/this/path" }, { domain_name = "that.is.a.domain.com" app = "that.is.the.app" env = "that.is.the.env" path = "/match/that/path" }] } resource "aws_cloudfront_distribution" "eb_app" { aliases = ["${var.docs_alias_domain}"] origin { count = "${length(var.s3_buckets_info)}" domain_name = "${lookup(var.s3_buckets_info[count.index + 1], "domain_name")}" origin_id = "${lookup(var.s3_buckets_info[count.index + 1], "app")}-${lookup(var.s3_buckets_info[count.index + 1], "env")}" origin_path = "" 不是公认的参数。经过更多的Google搜索,我发现了以下GH问题:

这让我产生了令人沮丧的认识,即为了利用这种行为,人们需要for and for-each中目前仅可用的v0.12.0-beta1功能,建议不要在生产中使用这些功能。因为,这是一个beta版本:

  

Terraform 0.12尚未发布。本指南包含一些初始信息,可在试用Terraform v0.12.0的beta版本时提供帮助,并且将在最终发行之前进行更详细的更新。请不要在生产基础架构上使用v0.12.0预发行版。

答案 1 :(得分:0)

我继续进行,并在terraform版本12中对此进行了破解。欢迎反馈!

https://github.com/jmgreg31/terraform_aws_cloudfront