当前位置: 首页 > 知识库问答 >
问题:

在Terraform工作区之间共享资源

梁丘经艺
2023-03-14

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

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

  • IAM角色和权限

例如:

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的状态。

如何在不同的地形工作区之间共享资源及其状态?

共有2个答案

孙朗
2023-03-14

如果name值与已配置的资源匹配,则具有name属性的资源(如aws\u iam\u role)将不会创建新实例。

因此,下面将创建一个名为LambdaGeneralRole的单个aws_iam_role

resource "aws_iam_role" "lambda_iam_role" {
  name = "LambdaGeneralRole"
  policy = <...>
}

...

resource "aws_iam_role" "lambda_iam_role_reuse_existing_if_name_is_LambdaGeneralRole" {
  name = "LambdaGeneralRole"
  policy = <...>
}

类似地,aws提供商将有效地创建一个S3 bucketnamemy store,如下所示:

resource "aws_s3_bucket" "store-1" {
  bucket        = "my-store"
  acl           = "public-read"
  force_destroy = true
}

...

resource "aws_s3_bucket" "store-2" {
  bucket        = "my-store"
  acl           = "public-read"
  force_destroy = true
}

即使资源被定义为具有各自独立地形状态的不同工作区,这种行为仍然有效。

为了充分利用这种方法,将共享资源定义为单独的配置。这样,在运行terraformdestroy之后,您就不会有破坏共享资源的风险。

长孙诚
2023-03-14

对于共享资源,我在一个单独的模板中创建它们,然后在模板中使用terraform\u remote\u state引用它们,我需要关于它们的信息。

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

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

共享服务模板

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}"
}

Terraform中的“后端”确定如何加载状态以及如何执行操作(如apply)。这种抽象支持非本地文件状态存储、远程执行等。

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

terraform_remote_state

从远程后端检索状态元数据

单个模板

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

 类似资料:
  • 设置容器要使用的卷数组。可以使用卷在服务或作业中的其他步骤之间共享数据。可以在主机上指定命名Docker卷、匿名Docker卷或绑定挂载。 工作流程 第一个作业(build)有一个build目录,但当第二个作业(deploy)运行时,它没有,只包含源代码。 这个项目是一个mono repo,我试图部署的代码位于路径,因此所有标志。

  • 问题内容: 是否有个好方法可以在Gunicorn工人之间共享多处理锁?我正在尝试用Flask写一个json API。一些API调用将与管理正在运行的进程的python类交互(例如用于视频转换的ffmpeg)。当我将网络工作者的数量增加到超过1个时,如何确保只有1个工作者同时与班级互动? 我最初的想法是使用multiprocessing.Lock,以便start()函数可以是原子的。我认为我没有找到

  • 我有一个Maven项目,其中有一个parent-pom项目和3个maven-module项目。其中2个模块是编译成WAR文件的Java-EE web应用程序。其中1个模块包含公共JAVA代码,这些代码在其他2个项目之间共享。共享JAVA代码很容易。 我的问题是如何共享常见的静态资源,如JavaScript、CSS和图像文件,而不在每个web模块中重复它们?我还希望这样做:我可以继续从Eclipse

  • 我从我的. jar文件运行多个作业。我想在我的工作之间共享状态。但所有输入在每个工作中消耗(来自kafka)并生成重复输出。我看到我的闪烁面板。所有的工作“记录发送”是3。我认为必须将数字拆分到我的工作。 我使用此命令创建作业 我怎样才能修复它?

  • 问题内容: 创建一个Today小部件,我用来保留一些数据。在主应用程序中,我正在使用。这不能由扩展读取(或可以?),这就是为什么我使用构造函数。 用户在主应用程序中持久存储的数据需要在扩展程序中可用。 目前,我坚持两者,以便可以共享这些值 问题是我应该将它们放在一起并仅在我的应用程序中使用,还是这种不好的做法? 编辑:我正在使用一个应用程序组容器。为了澄清起见,我问我是否应该在整个项目中用suit

  • 问题内容: 假设我有一个要注入到config中的模块: 有两个子模块: 这是第一个: 第二个是相同的,以简化示例: 您会注意到,您可以将它们作为提供者来访问以配置选项: 如果我们在控制器中,则可以覆盖每个范围,例如: 但是,如果他们总是共享相同的财产怎么办?如何在提供商之间共享某些东西? 我可以同时为和注入和配置共享属性吗? 如何同时访问和作为单个模块的扩展? 问题答案: 将模块插入两个共享这些属