我相信我在AWS api或aws_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,我会
在伪代码地形中,为了更加清楚,下面的代码块进一步说明了这一点
# 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完成了此任务,我很想听听这是怎么可能的。
答案 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中对此进行了破解。欢迎反馈!