标签: terraform

Terraform 无法创建角色并将其分配给 AWS Spot 队列资源

此处使用 terraform 示例启动现货车队时我需要提供所需的值。

iam_fleet_role      = "arn:aws:iam::12345678:role/spot-fleet"
Run Code Online (Sandbox Code Playgroud)

但是,我不想提供帐号,因此我想创建一个角色并附加“AmazonEC2SpotFleetTaggingRole”策略,因此我编写了以下代码,但出现错误:

* aws_spot_fleet_request.cheap_compute: "iam_fleet_role" doesn't look like a valid ARN ("^arn:[\\w-]+:([a-zA-Z0-9\\-])+:([a-z]{2}-(gov-)?[a-z]+-\\d{1})?:(\\d{12})?:(.*)$"): "test_role"
Run Code Online (Sandbox Code Playgroud)

我做错了什么还是应该以其他方式做?

 resource "aws_iam_role" "test_role" {
      name = "test_role"

      assume_role_policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Principal": {
            "Service": "ec2.amazonaws.com"
          },
          "Effect": "Allow",
          "Sid": ""
        }
      ]
    }
    EOF
    }
    resource "aws_iam_role_policy_attachment" "AmazonEC2SpotFleetTaggingRole-policy-attachment" {
        role = "${aws_iam_role.test_role.name}"
        policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole"
    }


# Request a Spot fleet
resource "a`enter code here`ws_spot_fleet_request" "cheap_compute" {
  iam_fleet_role      = "${aws_iam_role_policy_attachment.AmazonEC2SpotFleetTaggingRole-policy-attachment.role}" …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform

1
推荐指数
1
解决办法
506
查看次数

如何在不危及其内容的情况下在 Terraform 中声明和引用 ECR 存储库?

我正在构建 Terraform 配置以将一些容器部署到 AWS ECS。显然,我必须将 Docker 镜像推送到 ECR。我在 ECR 中创建了一个存储库并推送了图像。

现在我正在自动化。如果我这样声明aws_ecr_repository

data "aws_ecr_repository" "service" {
  name = "myrepository"
}
Run Code Online (Sandbox Code Playgroud)

然后 Terraform 将管理它。我最终可以用类似的东西来引用它

image = "${aws_ecr_repository.myrepository.repository_url}"
Run Code Online (Sandbox Code Playgroud)

在构建 ECS 任务定义的过程中。

我的印象是,当我terraform destroy作为开发周期的一部分运行时,Terraform 会删除这个存储库——或者当它有图像时会失败。这会很糟糕,因为terraform destroy要么永远不会完成,要么我必须清除 ECR 存储库才能成功完成该命令。

如何最好地引用已经存在但我似乎不希望 Terraform 管理的 ECR 存储库,因为 Terraform 可能会破坏位于 Terraform 之外的数据,即发布 CI 作业上传的 Docker 图像?

docker terraform aws-ecs aws-ecr terraform-provider-aws

1
推荐指数
1
解决办法
2600
查看次数

地形变量文件

我正在尝试使用变量文件在 Azure 中使用 Terraform 部署资源组,但如果我只有一个变量,它就可以工作。如果我使用两个,我会收到一个错误:

“标志-var-file 的无效值“variables.tf”:变量不支持多个映射声明”

变量文件如下:

variable "resource_group_name" {
  description = "The name of the resource group in which the resources will be created"
  default     = "im-from-the-variables-file"
}

variable "location" {
  description = "The location/region where the virtual network is created. Changing this forces a new resource to be created."
  default     = "west europe"
}
Run Code Online (Sandbox Code Playgroud)

用于部署的主要文件如下:

resource "azurerm_resource_group" "vm" {
  name     = "${var.resource_group_name}"
  location = "${var.location}"
}
Run Code Online (Sandbox Code Playgroud)

azure terraform

1
推荐指数
1
解决办法
1746
查看次数

如何在模板数据文件中有 ${something} 的文字字符串

我有一个模板文件,它正在创建一个 fluentd 文件并插入各种变量。我现在试图包含这个插件 ,它希望在配置文件中找到它自己的变量。问题是 Terraform 在模板中定义了一个变量${variable},这个插件希望在文件中找到它的变量作为文字${variable}

如何告诉 terraform 不要${}在文件中插入 a ,而是实际传递整个字符串?

文件片段:

<filter tomcat.logs>
  @type record_transformer
  <record>
    customer ${customer}
    environment ${environment}
    application ${application}
  </record>
</filter>
Run Code Online (Sandbox Code Playgroud)

以上${}是我为模板定义的所有变量。我现在需要添加一个这样的部分。

  <record>
    hostname      ${tagset_name}
    instance_id   ${instance_id}
    instance_type ${instance_type}
    az            ${availability_zone}
    private_ip    ${private_ip}
    vpc_id        ${vpc_id}
    ami_id        ${image_id}
    account_id    ${account_id}
  </record>
Run Code Online (Sandbox Code Playgroud)

所有这些都是变量,但它是如何实际需要渲染的模板的样子。我尝试将它们交换为 like $${account_id},但这最终只会在文件中呈现 account_id 。

data "template_file" "app" {
  template = "${file("templates/${var.application}.tpl")}"

  vars {
    customer               = "${var.customer}"
    environment            = "${var.environment}"
    application            = "${var.application}"
  }
} …
Run Code Online (Sandbox Code Playgroud)

terraform

1
推荐指数
1
解决办法
2883
查看次数

terraform - 将变量值拆分为 2

我有一个变量 (var.http_proxy) 保存代理详细信息(IP 地址:端口)。我将 env 变量设置为 lambda 并且我有 2 个变量,主机和端口。现在我需要使用拆分变量并分配代理主机和端口,而不是定义 2 个新变量。我正在使用下面的代码,这是错误的 -

environment = {
    variables = {
      proxy_host = "${split(":", var.http_proxy)[0]}"
      proxy_port = "${split(":", var.http_proxy)[1]}"
    }
  }
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

1
推荐指数
1
解决办法
6697
查看次数

Terraform Azure Provision VM 到现有子网/vnet/resourcegroup

我有一个现有的 Azure 环境,其中已经创建了资源组、网络、vnet 和子网。我想使用 terraform 自动将 VM 部署到这个现有的 Azure 环境中,但所有示例和文档都面向从头开始构建整个环境/基础设施。

任何人都可以建议有关如何使用 terraform 将 VM 部署到现有 Azure 环境的文档或示例吗?

azure terraform

1
推荐指数
1
解决办法
5172
查看次数

这个 AWS 模式“[\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]*”是什么意思?

使用 terraform 创建胶水表时,出现以下错误

 at 'table.storageDescriptor.columns.5.member.type' failed to satisfy constraint: Member must satisfy regular expression pattern: [\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]*;
Run Code Online (Sandbox Code Playgroud)

terraform 列类型如下所示:

struct<
subscriber_id:string,
price_plan_id:string,
usage_rate_id:string,
entitlement_id:string,
charged_gl:string,
uncharged_gl:string,
audit_trail:array<
    struct<
        time:string,
        outcome_details:array<
            struct<balance_id:array<string>,
                balance_delta:string,
                event_type:string,
                invoice_text:string>>>>>
Run Code Online (Sandbox Code Playgroud)

我一直关注可读性。当我将其更改为如下所示的缩小版本时,错误就会消失。

struct<subscriber_id:string,price_plan_id:string,usage_rate_id:string,entitlement_id:string,charged_gl:string,uncharged_gl:string,audit_trail:array<struct<time:string,outcome_details:array<struct<balance_id:array<string>,balance_delta:double,event_type:string,invoice_text:string>>>>>"
Run Code Online (Sandbox Code Playgroud)

AWS 文档还介绍了多个 api 的这种模式。以下是提到的 Glue 表的列类型。

类型 列中数据的数据类型。

类型:字符串

长度限制:最小长度为 0。最大长度为 131072。

图案:[\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]*

要求:否

我想了解这个模式,这个模式是什么意思。我尝试搜索模式中提到的 unicode 字符,但无法识别此处表示的字符。我对正则表达式很熟悉,但从未遇到过这种模式。

regex terraform terraform-provider-aws aws-glue-data-catalog

1
推荐指数
1
解决办法
3275
查看次数

尝试将对象放入存储桶时出现间歇性 Terraform 故障

我看到间歇性的 Terraform 故障在我看来就像是 Terraform 本身内部的竞争条件:

21:31:37 aws_s3_bucket.jar: Creation complete after 1s 
(ID: automatictester.co.uk-my-bucket)
...
21:31:38 * aws_s3_bucket_object.jar: Error putting object in S3 bucket
(automatictester.co.uk-my-bucket): NoSuchBucket: The specified bucket 
does not exist
Run Code Online (Sandbox Code Playgroud)

正如您在上面的日志中看到的那样,TF 首先声称它在 21:31:37 创建了一个存储桶,然后说它不能将对象放入该存储桶中,因为它在 21:31:38 不存在。

上述错误背后的代码:

resource "aws_s3_bucket" "jar" {
  bucket               = "${var.s3_bucket_jar}"
  acl                  = "private"
}
...
resource "aws_s3_bucket_object" "jar" {
  bucket               = "${var.s3_bucket_jar}"
  key                  = "my.jar"
  source               = "${path.module}/../target/my.jar"
  etag                 = "${md5(file("${path.module}/../target/my.jar"))}"
}
Run Code Online (Sandbox Code Playgroud)

显然,这两者之间定义了一种隐式依赖关系,因此我想到的失败的唯一原因是 Amazon S3 的最终一致性。

如何处理此类错误?我相信显式定义的依赖depends-on不会为已经存在的隐式依赖提供任何价值。

amazon-s3 amazon-web-services terraform terraform-provider-aws

1
推荐指数
1
解决办法
920
查看次数

Terraform with Azure - 如何创建存储帐户?

在与 Terraform 战斗了一天后,我在这里呼救。

Terraform v0.11.11
+ provider.azurerm v1.20.0
Run Code Online (Sandbox Code Playgroud)

我正在尝试从头开始创建一个新的资源组和一个存储帐户。看起来可以在没有存储帐户的情况下创建资源组:

resource "azurerm_resource_group" "rg1" {
  name     = "myResourceGroup"
  location = "West Europe"
}
Run Code Online (Sandbox Code Playgroud)

资源组已创建,目前不存在存储帐户。所以在这一点上我很高兴。我执行destroy并从头开始。

现在,在代码中,创建资源组后,我想创建一个存储帐户,因为稍后其他资源需要引用它。azurerm_storage_account需要的唯一引用是对资源组的引用。

关于 azurerm_storage_account 的信息 https://www.terraform.io/docs/providers/azurerm/d/storage_account.html

代码现在看起来像这样:

resource "azurerm_resource_group" "rg1" {
  name     = "myResourceGroup"
  location = "West Europe"
}

data "azurerm_storage_account" "stacc1" {
  name                     = "mystorageaccount"
  resource_group_name      = "${azurerm_resource_group.rg1.name}"
}
Run Code Online (Sandbox Code Playgroud)

我运行计划命令并获得以下输出:

$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will …
Run Code Online (Sandbox Code Playgroud)

azure terraform azure-storage-account terraform-provider-azure

1
推荐指数
1
解决办法
3359
查看次数

如何使用 terraform 删除和替换默认的 GCP vpc?

Google 建议删除和创建您自己的 VPC for prod

此资源管理默认 VPC:https : //www.terraform.io/docs/providers/aws/r/default_vpc.html

但我想将不同的 VPC 设置为默认值并删除自动创建的 VPC。

这怎么可能?

vpc google-cloud-platform terraform terraform-provider-gcp

1
推荐指数
1
解决办法
2918
查看次数