标签: terraform-provider-aws

Terraform-尽管变量已在同一文件中声明,但找不到变量的资源

Terraform找不到在引用所在的文件中声明的资源。

看来这行正在引起麻烦:role_arn = "${aws_iam_role.newsapi_lambda_codepipeline.arn}"。它找不到newsapi_lambda_codepipeline哪个声明为resource "aws_iam_role" "newsapi_lambda_codepipeline" { ... }

这是我的main.tf:

resource "aws_s3_bucket" "newsapi_lambda_builds" {
  bucket = "newsapi-lambda-builds"
  acl    = "private"
}

resource "aws_iam_role" "newsapi_lambda_codebuild" {
  name = "newsapi-lambda-codebuild"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:GetBucketVersioning"
      ],
      "Resource": "arn:aws:s3:::newsapi_lambda_builds",
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::newsapi_lambda_builds"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "lambda:invokefunction",
        "lambda:listfunctions"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
    {
      "Effect": "Allow", …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform devops-services hcl terraform-provider-aws

7
推荐指数
2
解决办法
5240
查看次数

通过Terraform在目标组中添加ASG实例

我有一个Terraform脚本,它创建启动配置,自动缩放组,单个ALB,一个目标组和一个侦听器。使用自动扩展组启动实例。

如何在同一脚本中通过Terraform在目标组中添加新启动的实例?

resource "aws_launch_configuration" "CF2TF-LC" {
  name                 = "CF2TF-LC"
  depends_on           = ["aws_iam_role_policy_attachment.CF2TF-IAM-PA", "aws_security_group.CF2TF-SG-Web"]
  image_id             = "ami-14c5486b"
  instance_type        = "t2.micro"
  iam_instance_profile = "${aws_iam_instance_profile.CF2TF-IAM-IP.id}"
  key_name             = "CF2TF"
  security_groups      = ["${aws_security_group.CF2TF-SG-Web.id}"]
  user_data            = "${template_file.CF2TF-UserData.rendered}"
}

resource "aws_autoscaling_group" "CF2TF-ASG" {
  name                      = "CF2TF-ASG"
  depends_on                = ["aws_launch_configuration.CF2TF-LC"]
  vpc_zone_identifier       = ["${aws_subnet.CF2TF-Subnet-1a.id}", "${aws_subnet.CF2TF-Subnet-1d.id}"]
  max_size                  = 3
  min_size                  = 2
  health_check_grace_period = 300
  health_check_type         = "EC2"
  desired_capacity          = 2
  force_delete              = true
  launch_configuration      = "${aws_launch_configuration.CF2TF-LC.id}"
}

resource "aws_lb" "CF2TF-ALB" {
  name               = "CF2TF-ALB"
  subnets            = ["${aws_subnet.CF2TF-Subnet-1a.id}", "${aws_subnet.CF2TF-Subnet-1d.id}"]
  internal …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

7
推荐指数
2
解决办法
2725
查看次数

从 terraform 地图变量中提取值

我正在尝试根据以下某些条件从地图变量中提取值:-

    Variables.tf File content
    variable "users" {
    type = "map"
    default = {
    "101" = "abc@gmail.com"
    "102" = "def@gmail.com"
    "103" = "xyz@gmail.com"
    "104" = "klm@gmail.com"
    "105" = "pqr@gmail.com"
    "106" = "tuv@gmail.com"
     }
   }
Run Code Online (Sandbox Code Playgroud)

下面是我的 main.tf 文件

    module "instance" {
    instance_private_ip = ["11.12.13.x"]
    dns_map = ["y"]
    users = ["z"]
    }

    module "instance2" {
    instance_private_ip = ["11.12.14.a"]
    dns_map = ["b"]
    users = ["c"]
    }
Run Code Online (Sandbox Code Playgroud)

用户变量中的x值应为偶数,例如 - 102、104 等。y应与x相同。 值z应对应于x 和 y。用户变量中的值a应该是全偶数,例如 …

terraform terraform-provider-aws

7
推荐指数
1
解决办法
3万
查看次数

在 terraform 对象中使用输出值

我有多个输出变量,我想创建一个父输出变量,然后将其他输出放入其中。我搜索过它,发现我们可以使用 terraform 对象来获取它,但无法获得正确的语法。输出.tf

output "public_subnet" {
  value = "${module.my_vpc.public_subnets_ids}"
}
output "vpc_id" {
  value = "${module.my_vpc.vpc_id}"
}
output "private_subnet" {
  value = "${module.my_vpc.private_subnets_ids}"
}
Run Code Online (Sandbox Code Playgroud)

我希望我的输出位于一个对象中,或者您可以说具有所有子输出值的父输出变量,我想出了几行,我知道这些行的语法不正确,但会让您了解我的想法。

output "vpc" {
  value = {
    vpc_id         = "${module.my_vpc.vpc_id}"
    public_subnet  = "${module.my_vpc.public_subnets_ids}"
    private_subnet = "${module.my_vpc.private_subnets_ids}"
  }
  type = object({ vpc_id = string, public_subnet = string, private_subnet = string })
}
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-vpc terraform terraform-provider-aws

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

Terraform:附加非托管 IAM 角色

地形版本:12

\n

我们有一个遗留的、不受 Terraform IAM 角色管理的问题,我想从一个aws_iam_policy_attachment块中引用该角色,并且我尝试了以下操作:

\n
  resource "aws_iam_policy_attachment" "example-attach" {\n  name = "example-attach"\n\n  roles = [ \n    aws_iam_role.managed-role.name, \n    "arn:aws:iam::1234567890:role/unmanaged-role"\n  ]\n\n  policy_arn = aws_iam_policy.example-policy.arn\n}\n
Run Code Online (Sandbox Code Playgroud)\n

试运行效果很好,但应用 TF 时说:

\n
\n

\xe2\x80\x93 ValidationError: 指定的 roleName 值无效。它必须仅包含字母数字字符和/或以下内容:+=,.@_-

\n
\n

有没有办法可以只引用非托管角色而不在 TF 中定义它?或者是否有某种非破坏性的方式来声明它,而不会改变与非托管角色有关的任何内容?

\n

amazon-web-services terraform terraform-provider-aws

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

仅将 AWS Aurora Engine 版本指定为 Terraform 中的主版本号

我有一些创建 AWS Aurora RDS 集群的 Terraform 代码:

resource "aws_rds_cluster" "default" {
  provider                = aws.customer
  cluster_identifier      = "my_id"
  engine                  = "aurora-mysql"
  engine_version          = "5.7.mysql_aurora.2.03.2"
  database_name           = var.db_name
  port                    = var.db_port
  master_username         = var.db_master_username
  master_password         = random_password.sqlpassword.result
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
  skip_final_snapshot     = true
  db_subnet_group_name    = aws_db_subnet_group.default.name
  vpc_security_group_ids  = [aws_security_group.rds.id]
  deletion_protection     = true
}
Run Code Online (Sandbox Code Playgroud)

这段代码已经工作正常有一段时间了,直到最近因此terraform apply错误而失败Error: Failed to modify RDS Cluster (my_id): InvalidParameterCombination: Cannot upgrade aurora-mysql from 5.7.mysql_aurora.2.07.2 to 5.7.mysql_aurora.2.03.2

长话短说,AWS 在维护时段升级了次要版本号,并拒绝允许 Terraform 降级数据库。我同意 AWS 这样做,但我不想每次发生这种情况时都必须提交新的 Terraform …

amazon-web-services terraform amazon-aurora terraform-provider-aws

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

Terraform、AWS 和导入现有 SSL 证书

我正在从事一个项目,但我遇到了无法成功之路的情况。

事实上,我正在通过管道运行 terraform 代码,该代码依赖于通过 AWS Web 控制台添加的一堆证书,因此我拥有证书、私钥和证书链文件。

(我删除它们并尝试通过terraform导入)

谷歌搜索一下我得到了这些:

resource "aws_acm_certificate" "tch-cert" {
  private_key=file("private.key")
  certificate_body = file("actual_cert.cer")
  certificate_chain=file("inter.cer")
  }
Run Code Online (Sandbox Code Playgroud)

使用 terraform 上传 ssl 证书

我添加了代码,提交它并在 terraform plan 命令中收到如下错误

“解析错误... 2:15 未知令牌:IDENT 文件” “解析错误...2:17 未知令牌:IDENT 文件”

任何应该如何完成这些工作的建议或示例将非常感激。我也阅读了 terraform 文档,但它对我不起作用。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate

ssl terraform aws-certificate-manager terraform-provider-aws aws-application-load-balancer

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

无法组合“count”和“for_each”

这是我的代码源

\n
resource "aws_s3_bucket_object" "object" {\n  count               = var.s3_create[1] ? 1 : 0 \n  depends_on          = [aws_s3_bucket.bucket_backup]\n  for_each            = local.buckets_and_folders \n    bucket            = each.value.bucket_backup\n    key               = format("%s/", each.value.folder)\n  force_destroy       = true\n} \n
Run Code Online (Sandbox Code Playgroud)\n

换句话说,我正在尝试创建aws_s3_bucket_object依赖于变量的对象s3_create对象...如果为真则创建,否则不创建。

\n

问题:我无法在创建 terraform 资源时使用以下语法的组合,我正在了解:

\n
Error: Invalid combination of "count" and "for_each"\n\xe2\x94\x82\n\xe2\x94\x82   on ..\\s3\\resources.tf line 51, in resource "aws_s3_bucket_object" "object":\n\xe2\x94\x82   51:   for_each            = local.buckets_and_folders\n\xe2\x94\x82\n\xe2\x94\x82 The "count" and "for_each" meta-arguments are mutually-exclusive, only one should be used to be explicit about the number …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

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

Terraform 无法删除 lambda ENI 的安全组

我有一个 terraform 脚本,可以在 VPC 中创建 lambda 函数。由于 lambda 部署到 VPC,因此它会创建一个 ENI 并将其与我的安全组关联。但是,当我去更改该安全组(destroy)时,由于正在使用的 ENI 超时而失败。

我假设发生的情况是,Terraform 认识到 ENI 依赖于安全组,但没有认识到 lambda 函数依赖于 ENI,因此在尝试删除 ENI 之前不会尝试删除 lambda 函数。

期望的结果是能够更改安全组的名称和描述,而无需手动删除 lambda 函数和 ENI。

我尝试过创建各种“ depends_on ”,并设置 lambda 函数的生命周期,以便在安全组发生更改时销毁,但都不起作用。我正在使用 Terraform 版本 1.3.3 和 AWS 提供商版本 4.37.0。

错误:使用安全组 (sg-01ba40a4b03c5ddd2) 删除 ENI:发生 2 个错误:

等待 Lambda ENI (eni-02cd7771540d50f8e) 可用于分离:等待状态变为“可用”时超时(最后状态:“使用中”,超时:45m0s)

等待 Lambda ENI (eni-030c34234a51be116) 可用于分离:等待状态变为“可用”时超时(最后状态:“使用中”,超时:45m0s)

# ----------------------------------------------------------------------
# Security group
# ----------------------------------------------------------------------
resource "aws_security_group" "public" {
  name        = "test-sg"
  vpc_id      = var.vpc_id
  description = "Security group …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

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

如何使用 Terraform 脚本禁用 s3 存储桶 ACL?

AWS 的新建议是默认禁用 ACL,以便对象所有权默认为存储桶所有者。如何使用 Terraform 通过 aws_s3_bucket 资源实现此目的?

我尝试执行以下操作但没有成功

resource "aws_s3_bucket_acl" "example_bucket_acl" {
  bucket                = aws_s3_bucket.s3-bucket.id
  acl                   = "private"
  expected_bucket_owner = data.aws_caller_identity.current.account_id
}

data "aws_caller_identity" "current" {}
Run Code Online (Sandbox Code Playgroud)

此代码设置 ACL,以便只有存储桶所有者才能读取和写入存储桶以及存储桶中的对象,但对象所有权配置仍设置为“对象写入者”。此外,ACL 不会因设置而被禁用。

Terraform 关于 S3 ACL 的文档来看,它没有说明任何示例,也没有提供任何支持禁用 ACL 的参数。

在手动更改 AWS 中的设置后,我尝试通过运行 terraform plan 来暴力破解该解决方案,看看我会从该计划中得到什么差异,但它说我的基础设施与配置匹配。

有谁知道如何做到这一点?我目前正在使用 Terraform CLI v1.3.5 和 AWS 提供商 v4.40.0。

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

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