标签: terraform-provider-aws

Terraform:错误原因:ARN 无效。有效的 ARN 以 arn: 开头,并包含以冒号或斜杠分隔的其他信息

aws_wafv2_web_acl_logging_configuration我正在尝试将该资源与aws_cloudwatch_log_groupTerraform 配置中的资源集成。但是,我遇到了一个错误,指出:

Error reason: The ARN isn't valid. A valid ARN begins with arn: and includes other information separated by colons or slashes
Run Code Online (Sandbox Code Playgroud)

根据错误aws_cloudwatch_log_group arn是不正确的。

但我根据 Terraform 文档遵循了正确的格式。 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl_logging_configuration

有人知道这个错误的原因吗?我的代码如下。

resource "aws_cloudwatch_log_group" "test_waf_log_group" {
  name              = var.waf_log_group_name
  retention_in_days = 14

}

resource "aws_wafv2_web_acl_logging_configuration" "log_test_waf" {
  depends_on = [aws_cloudwatch_log_group.test_waf_log_group]

  log_destination_configs = [aws_cloudwatch_log_group.test_waf_log_group.arn]
  resource_arn            = aws_wafv2_web_acl.test_waf.arn

}
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

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

AWS S3 生命周期配置

我想设置 S3 存储桶的生命周期规则,以便存储桶中的每个文件在生成后 7 天将被删除。

如果我设置生命周期规则如下(下面是terraform代码,类似于控制台设置,所以我这里只用它),从今天起7天后,“test”桶中的所有文件是否会被删除,或者每个文件都将被删除因为它们是在不同的日期创建的,所以在不同的日期删除?我希望它们在不同的日期被删除,而不是一起被删除。

顺便说一句,我想我不需要配置:永久删除以前的版本,因为我的 s3 没有启用版本。如果我错了,请纠正我。

resource "aws_s3_bucket" "s3" {
  bucket        = "test"
  lifecycle_rule {
    id      = "remove_after_7d"
    enabled = true
    expiration {
      days = 7
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

amazon-s3 terraform terraform-provider-aws

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

aws_lb 的动态子网映射

我正在尝试使用 Terraform 创建一个网络负载平衡器,重要的是它与防止被破坏的弹性 IP 相关联。

我有如下代码:

resource "aws_lb" "balancer" {
  name = "${var.name}-nlb"

  internal           = "${var.internal}"
  load_balancer_type = "network"
  subnets            = ["${data.aws_subnet_ids.selected.ids}"]

  subnet_mapping {
    subnet_id     = "someid"
    allocation_id = "someid"
  }

  subnet_mapping {
    subnet_id     = "someid"
    allocation_id = "someid"
  }

  subnet_mapping {
    subnet_id     = "someid"
    allocation_id = "someid"
  }

  tags = "${merge(var.tags,
    map("Terraform", "true"),
    map("Environment", var.environment))}"
}
Run Code Online (Sandbox Code Playgroud)

我所追求的是subnet_mapping动态地制作块,因为这段代码位于一个模块中,我想根据传入的子网数量创建映射数量。要么是,要么是传入预定义的块。

有没有办法做到这一点?对我来说重要的是相关的弹性 IP 需要坚持下去。

amazon-web-services terraform terraform-provider-aws

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

如何在不危及其内容的情况下在 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
查看次数

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
查看次数

这个 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
查看次数

如何在子模块中使用远程状态数据源

我正在尝试从远程状态调用数据以引用网络 acl 的 vpc_id。当我运行计划/应用时,我收到错误“此对象没有参数、嵌套块或名为“vpc_id”的导出属性。

我试过使用“data.terraform_remote_state.*.vpc_id”以及“${}”语法。我尝试在子模块和父模块的 variables.tf 中定义 data.remote 信息。

我最终需要能够为不同的 VPC/子网动态调用这个模块。

相关的 VPC 已经存在,并且所有模块都已初始化。

s3 存储桶阶段/网络/vpc/terraform.tfstate:

"outputs": {
    "vpc_id": {
      "value": "vpc-1234567890",
      "type": "string"
    }
  },

enter code here
Run Code Online (Sandbox Code Playgroud)

模块/网络/acl/main.tf:

data "terraform_remote_state" "stage-network" {
  backend = "s3"

  config = {
    bucket          = "bucket"
    key             = "stage/network/vpc/terraform.tfstate"
  }
}

resource "aws_network_acl" "main" {
  vpc_id        = data.terraform_remote_state.stage-network.vpc_id
# acl variables here
Run Code Online (Sandbox Code Playgroud)

阶段/网络/acl/main.tf:

data "terraform_remote_state" "stage-network" {
  backend = "s3"

  config = {
    bucket          = "bucket"
    key             = "stage/network/vpc/terraform.tfstate"
  }
}

module "create_acl" …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

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

terraform 中 aws_launch_configuration 中的 source_dest_check

我希望从自动缩放启动配置中创建一个新启动的 ec2 实例,其中 source_dest_check = disabled(默认情况下已启用)。

我知道我们可以使用 source_dest_check = false 来创建 ec2 资源,但是如何在从 ASG 管理实例时实现相同的目标。

Terraform 不接受下面的 (source_dest_check = false) ,还有其他替代方法可以实现吗?

我可以从用户数据中实现这一点吗?

resource "aws_launch_configuration" "launchconfig" {
  name_prefix          = "bastion-"
  image_id             = "${data.aws_ami.amazon-linux-2.id}"
  instance_type        = "${var.instance_type}"
  placement_tenancy    = "default"
  enable_monitoring    = true
  #source_dest_check    = false
  security_groups      = ["${aws_security_group. security_group.id}"]
  iam_instance_profile = "${aws_iam_instance_profile.instance_profile.name}"
  key_name             = "${var. pem_key}"

  #Include user-data
  user_data = "${element(data.template_file.user_data.*.rendered, count.index)}"

  lifecycle {
    create_before_destroy = true
  }
}
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services boto3 terraform terraform-provider-aws

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

使用 Python 更新 terraform (.tf) 文件

我正在尝试使用 python 更新 terraform 模板,尽管我在尝试查找模块时遇到了一些问题(例如 PyYAML 来更新 yml 文件)。

我的目标是更新 git 存储库中存在的 terraform 文件,并创建一个拉取请求,合并后将触发管道以实现更改。

示例 .tf 文件:

variable "variable_1" {}
variable "variable_2" {}

locals {
  temp_locals = 0
}

resource "aws_iam_role" "MY_AWS_ACCOUNT" {
  name = "MY_AWS_ACCOUNT"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      },
      "Principal": {
        "AWS": [
          "arn:aws:iam::<AWS_ACCOUNT_ID>:user/user.name1"
        ]
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "aws_iam_role_policy_attachment" {
}
Run Code Online (Sandbox Code Playgroud)

想在这个文件中添加 user.name2 的 arn。

python terraform terraform-provider-aws

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