【问题标题】:Manage one-time infrastructure jobs in AWS在 AWS 中管理一次性基础设施作业
【发布时间】:2021-12-25 11:16:26
【问题描述】:

Terraform 是声明式 IaC,但有时您需要使用 aws cli 编写命令式修复程序.

但现在是时候做一些 Terraform 尚未准备好处理的事情了,比如在所有 AWS 区域中跨大量账户启用 Aws Config。

由于 Terraform 是声明式的并由 CI/CD 部署,因此添加/更改其他模块、提交不会有任何问题,CI/CD 会处理其余的工作。

但是,使用 aws cli 命令维护 bash 脚本以及每次创建新脚本时应该运行一次的相应最佳实践解决方案是什么?

我有很多手动解决方案,例如创建一个存储库并通过每次删除应用的脚本/添加新脚本来不断更新它。或者构建新工具来维护已经完成的脚本的状态,并且每次只运行新脚本。但我想问是否已经有最佳实践解决方案,无论是来自 AWS、第 3 方还是没有。

【问题讨论】:

  • 您可以在 terraform 中运行 (bash) 脚本没问题。我们例如在指定湖泊形成管理员时这样做。如果您知道自己在做什么,则具有适当触发器的 null_resources 可以很好地工作;)

标签: amazon-web-services continuous-integration terraform aws-cli infrastructure-as-code


【解决方案1】:

如果我站在你的立场上,我会将所有内容都保留在 terraform 中并鼓励团队也这样做,你可以使用 null_resource 来运行脚本并拥有许多花哨的触发器...
下面是一些例子:

variable "vpc_ids" {
  default = [
    "vpc1",
    "vpc2",
    "vpc3",
  ]
}

resource "null_resource" "tion" {
  count = length(compact(var.vpc_ids))

  triggers {
    vpcs = join(",", var.vpc_ids)
  }

  provisioner "local-exec" {
    when    = "create"
    command = "echo create ${var.vpc_ids[count.index]}"
  }

  provisioner "local-exec" {
    when    = "destroy"
    command = "echo destroy ${var.vpc_ids[count.index]}"
  }
}

resource "null_resource" "sh_test" {
  provisioner "local-exec" {
    when        = "create"
    command     = "if [ '${join(",", var.vpc_ids)}' != '' ]; then echo 'GOOD TO GO'; else echo 'NO VPC FOUND'; fi"
    interpreter = ["/bin/sh", "-c"]
  }
}

理想情况下,如果您可以编写代码,并且他们的 API 中提供了 AWS 功能,那么正确的做法是更改 AWS terraform 提供程序,代码是开源的并托管在 GitHub 上:
https://github.com/hashicorp/terraform-provider-aws

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 2021-11-12
    • 2016-04-26
    • 1970-01-01
    • 2023-03-20
    • 2011-12-08
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多