标签: terraform-provider-aws

配置 CloudWatch Events 以使用 Terraform 将输入发送到 Lambda 函数

我想配置 CloudWatch Events 以使用 Terraform 将输入发送到 Lambda 函数。我使用以下脚本来执行此操作:

resource "aws_cloudwatch_event_rule" "aa-rule-event" {
  count               = "${var.count}"
  name                = "${var.application_name}-${element(var.names, count.index)}"
  description         = "${element(var.descriptions, count.index)}"
  schedule_expression = "${element(var.cron-expressions, count.index)}"
  is_enabled          = "${element(var.rule-status-states, count.index)}"
}

resource "aws_cloudwatch_event_target" "aa-rule-target" {
  count     = "${var.count}"
  rule      = "${var.application_name}-${element(var.names, count.index)}"
  target_id = "CloudWatchToLambda"
  arn       = "arn:aws:lambda:${var.aws_region}:${var.aws_account_number}:function:${var.application_name}-${element(var.target-lambda-function, count.index)}"
}
Run Code Online (Sandbox Code Playgroud)

我需要通过此 CloudWatch Event 向目标 Lambda 提供输入。我知道可以配置输入,但是如何在 Terraform 中配置它?

amazon-web-services amazon-cloudwatch terraform terraform-provider-aws

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

启动源实例时出错:UnauthorizedOperation:您无权执行此操作

我尝试使用 Terraform 启动 EC2 实例,但收到以下错误:

启动源实例时出错:UnauthorizedOperation:您无权执行此操作。

我已将 AdministratorAccess 策略应用到我的 IAM 帐户,因此我想应该不存在 IAM 限制问题。

另外,我为我的帐户启用了 MFA,但我使用的是 STS 令牌,并且 API 调用正在从 Amazon 接受,因此这也不应该是问题。

我使用的 Terraform 代码非常简单:

provider "aws"{
    region="us-east-1"
}
resource "aws_instance" "web" {
  ami           = "ami-00d4e9ff62bc40e03"
  instance_type = "t2.micro"
  tags = {
    Name = "HelloWorld"
  }
}
Run Code Online (Sandbox Code Playgroud)

请您帮助我,因为我厌倦了很多事情,但我没能解决这个问题。及时感谢!

amazon-web-services terraform terraform-provider-aws

8
推荐指数
3
解决办法
2万
查看次数

从 Terraform 地图变量中提取键/值

我试图从 terraform 地图变量中提取左值和右值,但无法提取左值。下面是我的代码:-

variables.tf
  variable "notebook" {
    type = "map"
    default = {
    "01" = "a@a.com"
    "02" = "b@a.com"
    "03" = "c@a.com"
    "04" = "d@a.com"
    ......
  }
}
Run Code Online (Sandbox Code Playgroud)

下面是我在 main.tf 中的模块

 module "instance" {
   instance_ip = ["1.1.1.x", "1.1.2.y", "1.1.1.z","1.1.2.p"]
   dns         = ["x", "y", "z","p"]
   name        = ["a", "b", "c",  "d"]
 }
Run Code Online (Sandbox Code Playgroud)

输出应如下所示:-

 module "instance" {
   instance_ip = ["1.1.1.01", "1.1.2.02", "1.1.1.03","1.1.2.04" and so on]
   dns         = ["01", "02", "03","04" and so on]
   name        = ["a@a.com", "b@a.com", "c@a.com", "d@a.com and so on] …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

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

terraform 将输出保存到文件

我正在使用 terraform 生成证书。寻找有关如何使用 terrafrom 将 pem 和 cert 值转储到磁盘文件的信息。这是输出变量。我想将它们转储到变量中。任何参考代码片段?

output "private_key" {
  description = "The venafi private key"
  value       = venafi_certificate.this.private_key_pem
}

output "certificate_body" {
  description = "The acm certificate body"
  value       = venafi_certificate.this.certificate
}

output "certificate_chain" {
  description = "The acm certificate chain"
  value       = venafi_certificate.this.chain
}
'''
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

8
推荐指数
2
解决办法
5424
查看次数

是否可以通过 Terraform 为 AWS Transfer SFTP 设置自定义主机名

我正在尝试使用 AWS Transfer 设置具有自定义主机名的 SFTP 服务器。我正在使用 Terraform 管理资源。我目前已启动并运行资源,并且已使用 Terraform 创建一条 Route53 记录以指向 SFTP 服务器,但 SFTP 仪表板上的自定义主机名条目显示为空白。

当然,当我通过 AWS 控制台手动创建服务器并将 Route53 记录与其关联时,它看起来就像我所期望的那样:

我浏览了terraform 资源文档,并尝试了解如何通过 aws cli 或 cloudformation 完成它,但我没有任何运气。

我的服务器资源如下所示:

resource "aws_transfer_server" "sftp" {
  identity_provider_type = "SERVICE_MANAGED"
  logging_role           = "${aws_iam_role.logging.arn}"
  force_destroy          = "false"

  tags {
    Name = ${local.product}-${terraform.workspace}"
  }
}
Run Code Online (Sandbox Code Playgroud)

我的 Route53 记录如下所示:

resource "aws_route53_record" "dns_record_cname" {
  zone_id = "${data.aws_route53_zone.sftp.zone_id}"
  name    = "${local.product}-${terraform.workspace}"
  type    = "CNAME"
  records = ["${aws_transfer_server.sftp.endpoint}"]
  ttl = "300"
}
Run Code Online (Sandbox Code Playgroud)

从功能上讲,我可以继续使用现有的功能,我可以使用 DNS 连接到服务器,但我正在尝试了解完整的情况。

sftp terraform terraform-provider-aws

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

Terraform 可选资源的可选提供者

我有一个模块,我想在另一个区域有条件地创建 s3 存储桶。我尝试过这样的事情:

resource "aws_s3_bucket" "backup" {
   count = local.has_backup ? 1 : 0
   provider = "aws.backup"
   bucket = "${var.bucket_name}-backup"
   versioning { 
     enabled = true
   }
}
Run Code Online (Sandbox Code Playgroud)

但即使 count 为 0,我似乎也需要提供 aws.backup 提供程序。有什么办法解决这个问题吗?

注意:如果我可以使用单个提供程序在多个区域创建存储桶,这不会成为问题,请参阅https://github.com/terraform-providers/terraform-provider-aws/issues/8853

terraform terraform-provider-aws

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

Mongodb Atlas 的 Terraform 提供程序:我的数据库在哪里?

我已经通过 Mongodb terraform 提供程序成功创建了项目、用户和集群,但是我希望看到在我的新集群下已经创建的数据库,但找不到该数据库。我不确定它缺少什么或不正确,并且我在文档中找不到任何与我自己实现的内容不同的示例/信息。以下是我的 main.tf 文件中的相关信息:

# Create a db user
resource "mongodbatlas_database_user" "mongodb_user" {
  username = "${var.database_username}"
  password = "${random_string.master_password.result}"
  project_id = "${mongodbatlas_project.mongodb.id}"
  database_name  = "admin"

  roles {
    role_name = "readWrite"
    database_name = "admin"
  }
}
Run Code Online (Sandbox Code Playgroud)

团体

resource "mongodbatlas_project" "mongodb"{
  org_id = "${var.mongodb_atlas_org_id}"
  name = "${var.project_name}-${var.stage}"
 }
Run Code Online (Sandbox Code Playgroud)

# Create a cluster
resource "mongodbatlas_cluster" "mongodb-cluster" {
  project_id = "${mongodbatlas_project.mongodb.id}"
  name = "${var.cluster_name}-${var.stage}"
  num_shards = 1

  replication_factor = 3
  backup_enabled = true
  auto_scaling_disk_gb_enabled = true
  mongo_db_major_version = "4.0"

  //Provider Settings …
Run Code Online (Sandbox Code Playgroud)

terraform mongodb-atlas terragrunt terraform-provider-aws

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

如何仅在不存在时创建 terraform 资源

我正在使用 terraform 在 AWS 中创建一个角色。由于IAM是非区域服务,我只想创建一次角色。因此,每当我运行 terraform 时,它都应该检查该角色是否已经存在,如果不存在,它应该创建一个。

data "aws_iam_role" "iam_role_check" {
  name = "some_role"
}

resource "aws_iam_role" "iam_role" {
  count= "${data.aws_iam_role.iam_role_check != "null" ? 0 : 1}"
  name = "some_role"

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

data.aws_iam_role.iam_role_check:正在刷新状态...

错误:读取 IAM 角色 (some_role) 时出错:NoSuchEntity:找不到名为 some_role 的角色。状态码:404,请求ID:

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

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

更新在 Terraform 文件中创建的存储桶会导致 BucketAlreadyOwnedByYou 错误

我需要将策略添加到我之前在 Terraform 文件中创建的存储桶。

但是,这个错误与

创建 S3 存储桶时出错:BucketAlreadyOwnedByYou:您之前创建指定存储桶的请求已成功,并且您已拥有该存储桶。

如何修改 .tf 文件来创建存储桶,然后更新它?

resource "aws_s3_bucket" "bucket" {
  bucket = "my-new-bucket-123"
  acl    = "public-read"

  region = "eu-west-1"

  website {
    index_document = "index.html"
  }
}

data "aws_iam_policy_document" "s3_bucket_policy_document" {
  statement {
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.bucket.arn}/*"]
    principals {
      type        = "AWS"
      identifiers = ["*"]
    }
  }
}

resource "aws_s3_bucket" "s3_bucket_policy" {
  bucket = "${aws_s3_bucket.bucket.bucket}"
  policy = "${data.aws_iam_policy_document.s3_bucket_policy_document.json}"
}
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

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

如何确保 S3 存储桶名称不与 Terraform 一起使用?

我知道该data aws_s3_bucket资源可用于获取对现有存储桶的引用,但如何使用它来确保新的潜在存储桶名称是唯一的?

我正在考虑使用随机数的循环,但是如何使用它来搜索尚未使用的存储桶名称?

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

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