标签: infrastructure-as-code

使用 Terraform 进行 AWS RDS IAM 身份验证

我正在尝试正确设置我的基础设施,没有密码或密钥。AWS RDS 可以选择这样做,让用户(应用程序)能够使用生成的令牌进行身份验证。

但是,在文档中,其中一个步骤(一步)需要在 Postgres 数据库中运行查询以创建用户并授予他特定的权限:

CREATE USER test_rds WITH LOGIN;
GRANT rds_iam TO test_rds;
Run Code Online (Sandbox Code Playgroud)

我想使用 Terraform 配置整个堆栈。在 RDS 实例化之后,我查找了一些“技巧”来运行查询(这里),使用以下任一方法:

resource "null_resource" "db_setup" {
  depends_on = ["aws_db_instance.your_database_instance",   "aws_security_group.sg_allowing_external_access"]

    provisioner "local-exec" {
 // run shell commands to manually psql into the db

Run Code Online (Sandbox Code Playgroud)

或者:

resource "aws_instance" "web" {


  provisioner "remote-exec" {
    inline = [
   // run shell commands to manually psql into the db
Run Code Online (Sandbox Code Playgroud)

但是它们都需要创建主密码并以某种方式将其传递到“脚本”中。

是否可以使用 Terraform 干净利落地做到这一点,而不会传递硬编码密码?

我希望配置数据库并仅启用具有正确访问权限的特定 EC2/ECS 实例,而我的 git 存储库中没有任何密码。

postgresql amazon-web-services amazon-rds terraform infrastructure-as-code

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

如何忽略 Terraform 中的嵌套字段?

这里是 Terraform 新手。我这里有一个 ECS 计划任务的代码。每当我更改此设置并应用更改时,任务定义的第一个版本就会在 ECS 任务中设置。所以我尝试向其中添加生命周期方法。

resource "aws_cloudwatch_event_target" "sqs" {
  rule      = aws_cloudwatch_event_rule.sqs.name
  target_id = local.namespace
  arn       = aws_ecs_cluster.app.arn
  role_arn  = aws_iam_role.ecsRole.arn
  input     = "{}"

  ecs_target {
    task_count          = 1
    task_definition_arn = aws_ecs_task_definition.sqs.arn
    launch_type         = "FARGATE"
    platform_version    = "LATEST"

    network_configuration {
      security_groups = [aws_security_group.nsg_task.id]
      subnets         = split(",", var.private_subnets)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

尝试过:

    resource "aws_cloudwatch_event_target" "sqs" {
      rule      = aws_cloudwatch_event_rule.sqs.name
      target_id = local.namespace
      arn       = aws_ecs_cluster.app.arn
      role_arn  = aws_iam_role.ecsRole.arn
      input     = "{}"

      ecs_target {
        task_count          = 1
        task_definition_arn = aws_ecs_task_definition.sqs.arn …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-ecs terraform terraform-provider-aws infrastructure-as-code

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

如何正确重置 Terraform 默认 tfstate?

最近,我开始在 Terraform 配置中使用每个环境的工作空间。我最终拥有了三个工作区:开发登台生产。但由于历史原因,我的默认工作区仍然包含过时的 tfstate。

将其“重置”为默认状态的正确方法是什么?就像里面什么都没有一样。

实现此目的的一种方法是terraform state rm为每个资源手动执行。但这样一来,我就会接到数百个这样的电话。有某种terraform state reset类似物吗?

terraform devops infrastructure-as-code

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

将 AWS SecretManager 密钥作为每个 CDK 的整数值获取

我正在尝试将 Secret 作为每个 CDK 的整数值(端口号)获取,以便创建另一个资源。基本上,当我需要字符串参数的字符串值时,一切都工作正常,但是当我尝试将字符串解析为 int 以提供数字参数时,它不再工作。问题是 CDK 生成这些值的引用,并且无法将其转换为数字值。问题是:有没有办法以数字形式检索秘密值?

这里有一些代码片段:

SecretManager 对象:

const secret = secretsmanager.Secret.fromSecretAttributes(this, "SecretId", {
      secretCompleteArn: someValidSecretArn
    });
Run Code Online (Sandbox Code Playgroud)

工作正常:

host: secret.secretValueFromJson('host').toString()
Run Code Online (Sandbox Code Playgroud)

不起作用,因为参数需要是数字值:

port: secret.secretValueFromJson('port').toString()
Run Code Online (Sandbox Code Playgroud)

不工作,因为端口为空(它不是!),基本上无法解析引用:

port: parseInt(secret.secretValueFromJson('port').toString())
Run Code Online (Sandbox Code Playgroud)

不起作用,与上面相同:

port: +secret.secretValueFromJson('port').toString()
Run Code Online (Sandbox Code Playgroud)

amazon-web-services typescript aws-secrets-manager aws-cdk infrastructure-as-code

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

terraform_remote_state 数据块语法

我正在使用 Terraform 进行 AWS 多账户设置。我有一个主账户,它创建了几个子账户,在子账户中我引用了主账户的远程状态来检索输出值。

terraform plan测试 main.tf 中此配置的命令失败:

terraform {
  required_version = ">= 0.12.0"

  backend "s3" {
    bucket = "bucketname"
    key    = "statekey.tfstate"
    region = "us-east-1"
  }
}

provider "aws" {
  region  = "us-east-1"
  version = "~> 2.7"
}

data "aws_region" "current" {}

data "terraform_remote_state" "common" {
  backend = "s3"
  config {
        bucket = "anotherbucket"
        key    = "master.tfstate"
  }
}
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

?  test terraform plan

Error: Unsupported block type

  on main.tf line 20, in data "terraform_remote_state" "common":
  20: …
Run Code Online (Sandbox Code Playgroud)

terraform devops infrastructure-as-code terraform0.12+

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

为 Cloudformation ECS + Fargate 部署添加环境变量

我们的镜像具有应该在 docker 运行期间定义的环境变量,知道如何将此变量添加到 cloudformation 文件中。我们目前有类似的东西:

Task:
Type: AWS::ECS::TaskDefinition
Properties:
  Family: testenv
  Cpu: 256
  Memory: 512
  NetworkMode: 
  RequiresCompatibilities:
    - FARGATE
  ExecutionRoleArn: !ImportValue ECSTaskExecutionRole
  ContainerDefinitions:
    - Name: bonalds
      Image: gcr.io/zonalds-21/id-me:latest // image comes from gcr
      Cpu: 256
      Memory: 512
      PortMappings:
        - ContainerPort: 4567
          Protocol: tcp
      LogConfiguration:
        LogDriver: 
        Options:
          awslogs-group: 'zonalds'
          awslogs-region: !Ref AWS::Region
          awslogs-stream-prefix: 'routme'
Run Code Online (Sandbox Code Playgroud)

我似乎在 AWS 文档中找不到任何信息,添加环境变量的最佳方法是什么?

aws-cloudformation docker-compose google-cloud-functions infrastructure-as-code

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

如何从位于 Terraform 中不同模块中的另一个 main.tf 文件引用 id 值

有没有办法从位于不同模块的不同 main.tf 文件中的另一个对象引用 id 值?

如果两个资源或对象位于同一个文件中,则只需执行此操作

resource "aws_s3_bucket" "log_bucket" {
  bucket = "my-tf-log-bucket"
  acl    = "log-delivery-write"
}

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging {
    target_bucket = aws_s3_bucket.log_bucket.id
    target_prefix = "log/"
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以将用于日志记录的target_bucket分配给bucket的idresource "aws_s3_bucket"

现在假设我有两个名为log_module和的文件夹s3_module及其各自的main.tf文件。

main.tflog_module 内部包含

resource "aws_s3_bucket" "log_bucket" {
  bucket = "my-tf-log-bucket"
  acl    = "log-delivery-write"
}
Run Code Online (Sandbox Code Playgroud)

main.tfs3_module 内部包含

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging {
    target_bucket = "target-bucket"
    target_prefix …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services terraform infrastructure-as-code

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

在 ansible playbook 中使用 gitlab-ci vars

我想使用 Ansible playbook 在 docker 容器内设置远程环境。该剧本将从 gitlab-ci 运行,其中包含我在 Gitlab CI/CD 配置中设置的变量。我怎样才能做到这一点?

这是我想使用的模板。如何设置CI/CD 变量中的user_id和?password

tasks:
  - name: Run XYZ Container
    docker_container:
      name: XYZ
      restart_policy: on-failure
      image: xxxxxxxxxxx
      container_default_behavior: "compatibility"
      env:
        USER_ID= $USER_ID
        PASSWORD= $PASSWORD
Run Code Online (Sandbox Code Playgroud)

ansible gitlab-ci infrastructure-as-code cicd

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

Terraform:解决“没有可用版本与给定约束匹配”错误

我正在尝试更新 hashcorp/aws 提供商版本。

我添加了包含以下内容的 terraform.tf 文件:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

后来我尝试使用以下方法更新模块:

terraform init -upgrade
Run Code Online (Sandbox Code Playgroud)

然而,我已经开始明白:

Could not retrieve the list of available versions for provider hashicorp/aws: no available releases match the given constraints >= 2.0.0, ~> 3.27, ~> 4.0
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题呢?

amazon-web-services terraform infrastructure-as-code

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

对于带有 Beta 参数的 Google Cloud Platform 资源,正确的 Terraform 提供程序配置是什么?

对任何 beta 参数定义的任何 Google Cloud Platform (GCP) 资源进行地形改造都需要提供google-beta程序。是否应该google-beta使用提供者来代替与提供者一起使用google提供程序一起使用?

\n

换句话说,假设$GKE_CLUSTER_NAMEGCP 项目中存在某个 Google Kubernetes Engine (GKE) 集群$GCP_PROJECT_NAME某个 Google Kubernetes Engine (GKE) 集群:

\n
gcloud container clusters list \\\n--format="value(name)" \\\n--project=$GCP_PROJECT_NAME\n\n#=>\n\n. . .\n$GKE_CLUSTER_NAME\n. . .\n
Run Code Online (Sandbox Code Playgroud)\n

启用配置连接器后:

\n
gcloud container clusters describe $GKE_CLUSTER_NAME \\\n--format=\xe2\x80\x9cvalue(addonsConfig.configConnectorConfig.enabled)\xe2\x80\x9d \\\n--zone=$GKE_CLUSTER_ZONE\n\n#=>\n\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n

Terraforming$GKE_CLUSTER_NAME需要一个google_container_cluster资源定义,container_cluster.tf其中包括config_connector_config参数(在addons_config块内;更多信息请参见此处)和provider参数(官方参考文档中缺少):

\n
resource "google_container_cluster" "test" {\n  addons_config {\n    config_connector_config {\n      enabled …
Run Code Online (Sandbox Code Playgroud)

google-cloud-platform google-kubernetes-engine terraform terraform-provider-gcp infrastructure-as-code

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