我在AWS中使用Terraform部署了一个基础设施。这个基础设施可以部署到不同的环境中,我使用的是工作区。
部署中的大多数组件应该为每个工作区分别创建,但我有几个关键组件希望在它们之间共享,主要是:
例如:
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的状态。
如何在不同的地形工作区之间共享资源及其状态?
如果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 bucket
namemy 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
之后,您就不会有破坏共享资源的风险。
对于共享资源,我在一个单独的模板中创建它们,然后在模板中使用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。我认为必须将数字拆分到我的工作。 我使用此命令创建作业 我怎样才能修复它?
我很难搞清楚这一点,基本上我有一个< code>headerTitleService,我希望能够在我的< code>header组件中动态设置标题,但由于某种原因,当我设置标题时,什么也没有显示?我没有得到任何错误,所以我似乎可以找出问题是什么.. 表头.组件. ts header.component.html home.component.ts
问题内容: 创建一个Today小部件,我用来保留一些数据。在主应用程序中,我正在使用。这不能由扩展读取(或可以?),这就是为什么我使用构造函数。 用户在主应用程序中持久存储的数据需要在扩展程序中可用。 目前,我坚持两者,以便可以共享这些值 问题是我应该将它们放在一起并仅在我的应用程序中使用,还是这种不好的做法? 编辑:我正在使用一个应用程序组容器。为了澄清起见,我问我是否应该在整个项目中用suit