标签: terraform

terraform的静态代码分析工具

有没有针对 terraform 的静态代码分析工具?我试过 tflint。但它不支持模块或资源属性的输出。请提出任何其他建议

static-analysis terraform

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

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创建API网关的方法响应不同?

我有以下 terraform 脚本,它创建一个 API 网关,将请求传递给 lambda 函数。

provider "aws" {

  access_key = "${var.access_key}"

  secret_key = "${var.secret_key}"
  # 
  region     = "${var.region}"

  version = "~> 2.6"
}

resource "aws_api_gateway_rest_api" "MyDemoAPI" {
  name        = "MyDemoAPI"
  description = "This is my API for demonstration purposes"
}

resource "aws_api_gateway_resource" "MyDemoResource" {
  rest_api_id = "${aws_api_gateway_rest_api.MyDemoAPI.id}"
  parent_id   = "${aws_api_gateway_rest_api.MyDemoAPI.root_resource_id}"
  path_part   = "mydemoresource"
}

resource "aws_api_gateway_method" "MyDemoMethod" {
  rest_api_id   = "${aws_api_gateway_rest_api.MyDemoAPI.id}"
  resource_id   = "${aws_api_gateway_resource.MyDemoResource.id}"
  http_method   = "POST"
  authorization = "NONE"
}

resource "aws_api_gateway_integration" "MyDemoIntegration" {
  rest_api_id = "${aws_api_gateway_rest_api.MyDemoAPI.id}" …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform aws-api-gateway

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

Terraform 0.12 - 从嵌套的 for 循环生成地图/对象

作为Terraform 0.12 嵌套 for 循环的后续。我试图从嵌套循环中生成一个对象,但失败得很惨:(

您将如何进行生产:

  Outputs:

  association-list = {
    "policy1" = "user1"
    "policy2" = "user1"
    "policy2" = "user2"
  }
Run Code Online (Sandbox Code Playgroud)

从:

iam-policy-users-map = {
  "policy1" = [ "user1" ]
  "policy2" = [ "user1", "user2" ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了许多变体:

variable iam-policy-users-map {
  default = {
    "policy1" = [ "user1" ]
    "policy2" = [ "user1", "user2" ]
  }
}

locals {
  association-map = merge({
    for policy, users in var.iam-policy-users-map : {
      for user in users : {
        policy => user
      } …
Run Code Online (Sandbox Code Playgroud)

terraform

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

Terraform - 如何为 AWS Lambda 创建 IAM 角色并部署两者?

我正在学习地形。我正在尝试创建一个新的 Lambda 函数。我意识到我还需要创建一个 IAM 角色。所以我正在尝试使用 Terraform 来做这两项工作。但它不允许我创建角色。

这是我的 Terraform 文件

provider "aws" {
  profile = "default"
  region  = "eu-west-1"
}

data "aws_iam_policy" "AWSLambdaBasicExecutionRole" {
  arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

resource "aws_iam_role" "terraform_function_role" {
  name               = "terraform_function_role"
  assume_role_policy = "${data.aws_iam_policy.AWSLambdaBasicExecutionRole.policy}"
}

resource "aws_lambda_function" "terraform_function" {
  filename         = "terraform_function.zip"
  function_name    = "terraform_function"
  handler          = "index.handler"
  role             = "${aws_iam_role.terraform_function_role.id}"
  runtime          = "nodejs8.10"
  source_code_hash = "${filebase64sha256("terraform_function.zip")}"
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

Error creating IAM Role terraform_function_role: MalformedPolicyDocument: Has prohibited field Resource
status code: 400
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

amazon-web-services amazon-iam aws-lambda terraform

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

使用 Terraform 的 Google Cloud 凭据

这是一个新手问题,但我刚刚开始使用 Terraform / Terragrunt 进行 GCP 配置,我发现获取 GCP 凭据的工作流程非常混乱。我来自只使用 AWS,在那里获取凭证并在 AWS CLI 中配置它们非常简单。

基本上,Google Cloud Provider 文档指出您应该provider像这样定义一个块:

provider "google" {
  credentials = "${file("account.json")}"
  project     = "my-project-id"
  region      = "us-central1"
  zone        = "us-central1-c"
}
Run Code Online (Sandbox Code Playgroud)

credentials字段显示我(显然)必须生成一个服务帐户,并在我的文件系统上的某处保留一个 JSON。

但是,如果我运行该命令gcloud auth application-default login,则会生成一个位于~/.config/gcloud/application_default_credentials.json;的令牌。或者我也可以使用gcloud auth login <my-username>. 从那里我可以使用gcloud命令从命令行访问 Google API(这也是 Terraform 在幕后所做的)。

那么为什么 Terraform 提供程序需要服务帐户的 JSON 文件呢?为什么不能只使用gcloudCLI 工具已经在使用的凭据?

顺便说一句,如果我将 Terraform 配置为指向该application_default_credentials.json文件,则会出现以下错误:

正在初始化模块...

正在初始化后端...

错误:无法获取现有工作区:查询 Cloud Storage 失败:获取 …

google-cloud-platform terraform terragrunt terraform-provider-gcp

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

terraform 验证错误:需要参数“区域”,但未设置

RDS为我的开发团队编写了一个自定义模块,用于部署RDS实例。我正在使用BitBucket源代码控制,并且我正在尝试集成一个BitBucket管道以terraform validate在我的.tf文件上运行以验证语法,然后再将其提供给开发人员使用。terraform init运行良好,但是当我运行时terraform validate出现以下错误:Error: Missing required argument. The argument "region" is required, but was not set.查看文档后,我很困惑,如果该命令实际上没有部署任何内容,为什么会检查已声明的提供程序?诚然,我是编写模块的新手。也许这不是我想要完成的正确命令?

Terraform version: v0.12.7

AWS Provider version: 2.24

bitbucket-pipelines.yml:

image: hashicorp/terraform:full

pipelines:
  branches:
    master:
    - step:
        script:
          - terraform version
          - terraform init
          - terraform validate
Run Code Online (Sandbox Code Playgroud)

Module tree:

??? CHANGELOG.md
??? README.md
??? bitbucket-pipelines.yml
??? main.tf
??? modules
?   ??? db_instance
?   ?   ??? README.md
?   ? …
Run Code Online (Sandbox Code Playgroud)

bitbucket continuous-deployment terraform terraform-provider-aws

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

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

stepfunction 的 AWS Service Principal 值是多少?

我正在编写用于为 AWS StepFunctions 创建 IAM 角色的 terraform。应该是什么价值主要assume_role_policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "stepfunctions.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我收到错误

错误:创建 IAM 角色 my_utility_sfn 时出错:MalformedPolicyDocument:策略中的委托人无效:“SERVICE”:“stepfunctions.amazonaws.com”

amazon-web-services terraform aws-step-functions

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

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