如何为无服务器应用程序构建Terraform模板

时间:2019-04-13 21:40:33

标签: terraform

我有几个lambda,它们是由来自队列的消息或通过api网关触发的,具有不同的存储类型,依此类推。

每个组件都位于各自的存储库中,但总体而言,它们是同一体系结构的一部分。 我正在尝试构建terraform模板,但是我担心的一个事实是,其中一些lambda具有共享资源,例如存储表或s3存储桶,因此我想知道仅拥有一个Lambda是否是一个好主意。每个lambda的回购中的main.tf文件仅创建lambda本身,而不创建其任何其他依赖项,这样我就可以通过ci / cd重新部署lambda,而不必担心其他组件,并且可以将所有其他部分放在在中央仓库中或多或少持续时间长的架构,仅在必要时通过此仓库专用的ci / cd管道运行它们。我也正在考虑拥有一个包含所有共享资源名称的tfvar文件。

这是有效的方法吗?不利之处是什么?有哪些替代方案?

1 个答案:

答案 0 :(得分:-1)

您处在正确的轨道上。您可以为lambda提供一个模块,该模块接受那些公共资源作为变量。您可以然后将terraform import的资源硬编码,然后将其传递给lambda:

modules/lambda文件夹上

resource "aws_lambda_function" "this" {
    """
    My lambda stuff
    """
}

在主文件夹main.tf

module "lambda1"{
   s3_bucket = "${var.common_bucket}"
   iam_role = "${var.common_role}"
   subnets = "${var.private_subnets}"
   ....
}

module "lambda2"{
   s3_bucket = "${var.common_bucket}"
   iam_role = "${var.common_role}"
   subnets = "${var.private_subnets}"
   ....
}

module "lambda3"{
   s3_bucket = "${var.common_bucket}"
   iam_role = "${var.common_role}"
   subnets = "${var.private_subnets}"
   ....
}

如果您要导入公共资源(例如,该规则的iam策略),请执行以下操作

resource "aws_iam_policy" "my_policy" {

}

然后运行命令terraform import aws_iam_policy.my_policy <policy arn>