标签: terraform-provider-aws

无法代入角色并验证指定的 targetGroupArn

我想使用 terraform ecs_service 创建和部署集群,但我无法这样做。我的terraform applys 总是在 IAM 角色上失败,我不太清楚。具体来说,错误信息是:

InvalidParametersException:无法代入角色并验证指定的 targetGroupArn。请验证传递的 ECS 服务角色是否具有适当的权限。

我发现:

  1. 当我iam_role在 ecs_service 中指定时,ECS 抱怨我需要使用服务相关角色。
  2. 当我iam_role在 ecs_service 中发表评论时,ECS 抱怨所担任的角色无法验证 targetGroupArn。

我的 terraform 跨越了一堆文件。我把感觉像下面的相关部分。尽管我已经看到发布了一些类似的问题,但没有一个为我提供解决上述困境的可行解决方案。

## ALB

resource "aws_alb" "frankly_internal_alb" {
    name = "frankly-internal-alb"
    internal = false
    security_groups = ["${aws_security_group.frankly_internal_alb_sg.id}"]
    subnets = ["${aws_subnet.frankly_public_subnet_a.id}", "${aws_subnet.frankly_public_subnet_b.id}"]
}

resource "aws_alb_listener" "frankly_alb_listener" {
    load_balancer_arn = "${aws_alb.frankly_internal_alb.arn}"

    port = "8080"
    protocol = "HTTP"

    default_action {
        target_group_arn = "${aws_alb_target_group.frankly_internal_target_group.arn}"
        type = "forward"
    }
}

## Target Group

resource …
Run Code Online (Sandbox Code Playgroud)

amazon-ecs amazon-iam terraform terraform-provider-aws

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

将 S3 静态站点与应用程序负载均衡器结合使用

我有一个 ALB,它当前将流量路由到多个 url。如果我们需要执行维护,我希望能够将流量路由到静态 S3 站点。然后我们将显示一个静态的“维护”页面而不是我们的登录页面。

我创建了一个 CloudFront 分配,允许使用 SSL 证书加载 S3 站点,但我不确定如何连接该分配以将所有流量发送到 S3 维护站点。

这是我正在使用的 Terraform ALB 侦听器。我可以指定我的CloudFront的分布arntarget_group并将它路由所有流量的静态网站?

或者我可以简单地将我的 S3arn与允许 ALB 访问以获取存储桶对象的 S3 策略链接起来吗?

resource "aws_alb_listener" "ssl_alb_httpslistener" {
   load_balancer_arn = "${aws_alb.alb_lis.arn}"
   port = "443"
   protocol = "HTTPS"
   ssl_policy = "Sec-TLS"
   certificate_arn = "${var.ssl_cert_arn}"

    default_action {
     target_group_arn = "${data.terraform_remote_state.php.target_arn}"
     type = "forward"
   }
}
Run Code Online (Sandbox Code Playgroud)

我希望我可以将通过 ALB 的流量从target_group. 好奇这是否是解决此问题的最佳方法。

load-balancing amazon-s3 static-site terraform terraform-provider-aws

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

Terraform 中的相对路径

我正在尝试使用 terraform 创建一个 AWS lambda 函数。我的 terraform 目录看起来像

  • 地形
    • 政策
      • 主文件
    • 拉姆达
      • 文件/
      • 主文件
    • 主文件

我的 lambda 函数存储在/terraform/lambda/files/lambda_function.py 中

每当我应用 terraform 时,我都有一个“null_resource”,它会在本地机器上执行一些命令来压缩 python 文件

variable "pythonfile" {
  description = "lambda function python filename"
  type        = "string"
}

resource "null_resource" "lambda_preconditions" {
  triggers {
    always_run = "${uuid()}"
  }
  provisioner "local-exec" {
    command = "rm -rf ${path.module}/files/zips"
  }
  provisioner "local-exec" {
    command = "mkdir -p ${path.module}/files/zips"
  }
  provisioner "local-exec" {
    command = "cp -R ${path.module}/files/${var.pythonfile} ${path.module}/files/zips/lambda_function.py"
  }
  provisioner "local-exec" { …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda terraform terraform-provider-aws

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

Terraform - 从参数存储中获取值并传递给资源

我们将最新批准的 AMI 存储在 AWS 参数存储中。使用 Terraform 创建新实例时,我想以编程方式获取此 AMI ID。我有一个命令来提取 AMI ID,但我不确定如何将它与 Terraform 一起使用。

这是我用来提取 AMI ID 的命令:

$(aws ssm get-parameter --name /path/to/ami --query 'Parameter.Value' --output text)
Run Code Online (Sandbox Code Playgroud)

这是我的 Terraform 脚本:

resource "aws_instance" "nginx" {
  ami           = "ami-c58c1dd3" # pull value from parameter store
  instance_type = "t2.micro"
  #key_name        = "${var.key_name}"

  provisioner "remote-exec" {
    inline = [
      "sudo yum install nginx -y",
      "sudo service nginx start"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

如何使用命令在 Terraform 脚本中提取 AMI ID?

amazon-web-services terraform terraform-provider-aws

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

Terraform 上的 AWS - 如何避免“强制使用新资源”

我正在使用 Terraform 来启动我的云环境。

似乎即使是很小的配置更改也会影响幕后的许多资源。

例如,在我创建 AWS 实例的情况下 - 一个小的更改将导致所有实例的自动生成:

-/+ aws_instance.DC (new resource required)
      id:   "i-075deb0aaa57c2d" => <computed> (forces new resource) <----- How can we avoid that?
      ami:  "ami-01e306baaaa0a6f65" => "ami-01e306baaaa0a6f65"
      arn:  "arn:aws:ec2:ap-southeast-2:857671114786:instance/i-075deb0aaa57c2d" => <computed>
      associate_public_ip_address: "false" => <computed>
      availability_zone: "ap-southeast-2a" => <computed>
      .
      .
Run Code Online (Sandbox Code Playgroud)

我的问题特别与作为提供者的 AWS 相关:
我们如何避免每次破坏/创建资源?

也许是 Terraform 中的相关标志?


相关主题:

Terraform > ipv6_address_count: "" => "0"(强制新资源)

terraform > 在安全组上强制使用新资源


编辑:

深入了解计划输出,其中一项资源似乎发生了变化:

  security_groups.#: "0" => "1" (forces new resource)
  security_groups.837544107: "" => "sg-0892062659392afa9" (forces new resource) …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

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

Terraform:在 EKS/ECS 上部署 Docker Compose 应用程序

TL; 博士

我使用在 Docker Compose 上运行的开源服务器应用程序。它有一些服务,包括 PostgreSQL DB 和 Redis。

如何使用 Terraform 在完整的 IaC 中最好地将此应用程序部署到 AWS?


迄今为止的解决方案

1.AWS ecs-cli

ecs-cli现在支持docker compose在 Amazon ECS 中发送配置。

但是,我不认为它可以与 Terraform 工作流程集成(这可能不是什么大惊小怪)。我知道肯定是,ecs-cli不是在CloudFormation支持,按照这一问题在这个时候,仍然打开。所以我认为它也不能轻易添加到 Terraform。

2. 硬 EKS 方式

  • 获取您的docker-compose.yml文件,将其转换为kubectlYAML。
  • (准备在每次包升级时这样做)。
  • 使用 Terraform 的 + EKS API 进行部署(最小示例)。

但这还不是完全的 IaC。每次 docker-compose 在源存储库中更改时,您都必须重新翻译您的配置。这听起来像很多工作。

3. 使用 Helm 图表

  • 为应用程序编写 Helm 图表。
  • 运行 Terraform 以启动集群。
  • 仍然使用helm 提供程序运行 Terraform 以在集群上安装带有 Helm …

docker-compose kubernetes-helm apache-superset terraform-provider-aws amazon-eks

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

如何解决错误加载状态:AccessDenied:Access Denied 状态代码:403 尝试将 s3 用于 terraform 后端时?

我的简单 terraform 文件是:

provider "aws" {
  region = "region"
  access_key = "key" 
  secret_key = "secret_key"
}

terraform {
  backend "s3" {
    # Replace this with your bucket name!
    bucket         = "great-name-terraform-state-2"
    key            = "global/s3/terraform.tfstate"
    region         = "eu-central-1"
    # Replace this with your DynamoDB table name!
    dynamodb_table = "great-name-locks-2"
    encrypt        = true
  }
}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "great-name-terraform-state-2"
  # Enable versioning so we can see the full revision history of our
  # state files
  versioning {
    enabled = …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

9
推荐指数
4
解决办法
2万
查看次数

terraform 复制/上传文件到 aws ec2 实例

我们有 cronjob 和 shell 脚本,我们希望在使用 terraform 创建实例时将它们复制或上传到 aws ec2 实例。

我们尝试了

  1. 文件配置器:但它不是 wokring ,并且阅读此选项不适用于所有 terraform 版本
      provisioner "file" {
        source      = "abc.sh"
        destination = "/home/ec2-user/basic2.sh"
      }
Run Code Online (Sandbox Code Playgroud)
  1. 尝试过数据模板文件选项
    data "template_file" "userdata_line" {
      template = <<EOF
    #!/bin/bash
    mkdir /home/ec2-user/files2
    cd /home/ec2-user/files2
    sudo touch basic2.sh
    sudo chmod 777 basic2.sh
    base64 basic.sh |base64 -d >basic2.sh
    EOF
    }
Run Code Online (Sandbox Code Playgroud)

尝试了所有选项,但没有一个工作。
你能帮忙或建议吗?
我是 terraform 的新手,长期以来一直在这方面苦苦挣扎。

terraform terraform-template-file terraform-provider-aws

9
推荐指数
4
解决办法
9716
查看次数

将 efs 卷添加到 ecs fargate

我想将 EFS 与 fargate 一起使用,但在任务开始时出现此错误:

ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: Failed to resolve "fs-xxxxx.efs.eu-west-1.amazonaws.com" - check that your file system ID is correct
Run Code Online (Sandbox Code Playgroud)

我已经检查了文件系统 ID,它是正确的...我如何获得有关此错误的更多信息?它可能与安全组有关吗?

这是我与 terraform 一起使用的代码,我为两个可用区使用了两个挂载点:

resource "aws_efs_file_system" "efs_apache" {
}

resource "aws_efs_mount_target" "efs-mount" {
  count                     = 2

  file_system_id            = aws_efs_file_system.efs_apache.id
  subnet_id                 = sort(var.subnet_ids)[count.index]
  security_groups           = [aws_security_group.efs.id]
}

resource "aws_efs_access_point" "efs-access-point" {
  file_system_id = aws_efs_file_system.efs_apache.id
}

resource "aws_security_group" "efs" {
  name        = "${var.name}-efs-sg"
  description = "Allow traffic from self"
  vpc_id …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform amazon-efs aws-fargate terraform-provider-aws

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

从 0.12 升级到 0.13:无法实例化提供程序“registry.terraform.io/-/aws”以获取

我正在尝试从 terraform 0.12 升级到 0.13。

当我运行时,它似乎没有任何特定的语法问题terraform 0.13upgrade

version.tf添加了一个文件

+terraform {
+  required_providers {
+    aws = {
+      source = "hashicorp/aws"
+    }
+  }
+  required_version = ">= 0.13"
+}
Run Code Online (Sandbox Code Playgroud)

当我跑步时,terraform plan我得到了


Error: Could not load plugin


Plugin reinitialization required. Please run "terraform init".

Plugins are external binaries that Terraform uses to access and manipulate
resources. The configuration provided requires plugins which can't be located,
don't satisfy the version constraints, or are otherwise …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

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