amazon-web-services - 在 Terraform 工作空间之间共享资源

标签 amazon-web-services terraform devops terraform-provider-aws

我有一个在 AWS 中使用 Terraform 部署的基础设施。这个基础设施可以部署到不同的环境中,我正在使用工作空间。

部署中的大多数组件应该为每个工作区单独创建,但我有几个我希望在它们之间共享的关键组件,主要是:

  • IAM 角色和权限
  • 他们应该使用相同的 API 网关,但每个工作空间应该部署到不同的路径和方法

  • 例如:
    resource "aws_iam_role" "lambda_iam_role" {
      name = "LambdaGeneralRole"
      policy = <...>
    }
    
    resource "aws_lambda_function" "my_lambda" {
      function_name = "lambda-${terraform.workspace}"
      role = "${aws_iam_role.lambda_iam_role.arn}"
    }
    

    第一个资源是一个 IAM 角色,应该在该 Lambda 的所有实例之间共享,并且不应多次重新创建。

    第二个资源是一个 Lambda 函数,其名称取决于当前工作区,因此每个工作区将部署并跟踪不同 Lambda 的状态。

    如何在不同的 Terraform 工作空间之间共享资源及其状态?

    最佳答案

    对于共享资源,我在单独的模板中创建它们,然后使用 terraform_remote_state 引用它们在我需要有关它们的信息的模板中。

    以下是我如何实现它,可能还有其他方法可以实现它。 YMMV

    在共享服务模板(您将放置 IAM 角色)中,我使用 Terraform 后端将共享服务模板的输出数据存储在 Consul 中。您还需要output您想在其他模板中使用的任何信息。

    shared_services 模板

    terraform {
      backend "consul" {
        address = "consul.aa.example.com:8500"
        path    = "terraform/shared_services"
      }
    }
    
    resource "aws_iam_role" "lambda_iam_role" {
      name = "LambdaGeneralRole"
      policy = <...>
    }
    
    output "lambda_iam_role_arn" {
      value = "${aws_iam_role.lambda_iam_role.arn}"
    }
    

    A "backend" in Terraform determines how state is loaded and how an operation such as apply is executed. This abstraction enables non-local file state storage, remote execution, etc.



    在单个模板中,您使用 terraform_remote_state 调用后端作为数据源。并且可以使用该模板中的数据。
    terraform_remote_state :

    Retrieves state meta data from a remote backend



    个人模板
    data "terraform_remote_state" "shared_services" {
        backend = "consul"
        config {
            address = "consul.aa.example.com:8500"
            path    = "terraform/shared_services"
        }
    }
    
    # This is where you use the terraform_remote_state data source
    resource "aws_lambda_function" "my_lambda" {
      function_name = "lambda-${terraform.workspace}"
      role = "${data.terraform_remote_state.shared_services.lambda_iam_role_arn}"
    }
    

    引用文献 :

    https://www.terraform.io/docs/state/remote.html

    https://www.terraform.io/docs/backends/

    https://www.terraform.io/docs/providers/terraform/d/remote_state.html

    关于amazon-web-services - 在 Terraform 工作空间之间共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52606011/

    相关文章:

    amazon-web-services - 无法将 lambda 与 cloudwatch 事件触发器链接

    amazon-web-services - 具有认知能力的 Sagemaker 劳动力

    deployment - 如何配置所有Pod以立即开始接受请求连接?

    terraform - Terraform 教程中存在冲突的提供程序版本约束

    azure-devops - 如何防止直接推送到 Azure DevOps 中的主分支

    google-cloud-platform - 如何从 GUI 生成 Cloud Deployment Manager 配置 YAML?

    .htaccess - AWS EC2 ubuntu 服务器权限问题

    amazon-web-services - CloudFormation 中的 Redis 多可用区功能

    amazon-web-services - 提供的证书不是有效的自签名证书。请提供有效的自签名证书或证书链

    terraform - 如何使用带有传入变量的 terraform import ?