【问题标题】:AWS project structure using terraform使用 terraform 的 AWS 项目结构
【发布时间】:2023-04-02 03:45:02
【问题描述】:

我正在 coursera 上学习 Python 和 AWS 课程。然而,我使用的是 terraform,而不是使用 boto3 创建 s3 、 api gateway 和其他人。到目前为止一切都很好但是我遇到了一个问题。下面是我的 lambda 目录结构

每个 lambda 都有不同的目录结构,我必须在每个目录中 cd 才能使用 terraform apply 应用更改。

例子

下面是我在 terraform 中用于 lambda 函数之一的 lambda 代码。>

provider "aws" {
  region = "us-east-2"
}

terraform {
  required_version = "> 0.14"
  required_providers {
    aws = "~> 3.0"
  }
  backend "s3" {
    bucket = "nyeisterraformstatedata2"
    key = "api_gateway/lambda_function/terraform_api_gateway_lambda_validate.tfstate"
    region = "us-east-2"

    dynamodb_table = "terraform-up-and-running-locks-2"
    encrypt = true
  }
}

data "archive_file" "zip_file" {
  type        = "zip"
  source_dir  = "${path.module}/lambda_dependency_and_function"
  output_path = "${path.module}/lambda_dependency_and_function.zip"
}

resource "aws_lambda_function" "get_average_rating_lambda" {
  filename      = "lambda_dependency_and_function.zip"
  function_name = "validate"
  role          = data.aws_iam_role.lambda_role_name.arn
  handler       = "validate.lambda_handler"

  # The filebase64sha256() function is available in Terraform 0.11.12 and later
  # For Terraform 0.11.11 and earlier, use the base64sha256() function and the file() function:
  # source_code_hash = "${base64sha256(file("lambda_function_payload.zip"))}"
  source_code_hash = filebase64sha256(data.archive_file.zip_file.output_path)

  runtime = "python3.8"

  depends_on = [data.archive_file.zip_file]
}

>

data "aws_iam_role" "lambda_role_name" {
  name = "common_lambda_role_s3_api_gateway_2"
}

根据下面的评论,我使用以下代码创建了一个 main.tf

provider "aws" {
  region = "us-east-2"
}


module "test" {
  source = "../validate"

}

但我正在尝试使用 import 语句导入它给我一个错误,我无法弄清楚如何解决它

terraform import module.test.aws_lambda_function.test1 get_average_rating_lambda

Warning: Backend configuration ignored
│ 
│   on ../validate/validate.tf line 10, in terraform:
│   10:   backend "s3" {
│ 
│ Any selected backend applies to the entire configuration, so Terraform expects provider configurations only in the root module.
│ 
│ This is a warning rather than an error because it's sometimes convenient to temporarily call a root module as a child module for testing purposes, but this backend configuration block will have no
│ effect.
╵

Error: resource address "module.test.aws_lambda_function.test1" does not exist in the configuration.

Before importing this resource, please create its configuration in module.test. For example:

resource "aws_lambda_function" "test1" {
  # (resource arguments)
}

所以我的问题是 terraform 有一种方法可以告诉哪些所有文件已更改并一次性应用它们而不是一个一个地应用它们。因为我也是 terraform 的新手,所以如果有人认为这是错误的构建方式该项目请告诉我。谢谢

【问题讨论】:

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


    【解决方案1】:

    您可以做的是使用 main.tf 文件创建一个新目录,并使其成为包含整个云环境的项目。这些现有文件夹中的每一个都可以作为模块导入。如果您的每个文件夹都是正在运行的 terraform 项目,则可以将其作为模块导入而无需更改。

    然后,您将使用terraform import 命令导入每个资源,其方式类似于每个 lambda 和任何其他托管资源的terraform import module.aws_lambda_function my_lambda_id

    然后,您将拥有整个环境的状态文件,而不是每个 lambda 的状态文件。从那里开始,terraform 足够智能,可以检测到各个更改并相应地进行更新。

    【讨论】:

    • 感谢您的回复。让我试一试。
    • "如果您的每个文件夹都是一个正在运行的 terraform 项目,那么它已经可以作为一个模块导入而无需更改它。"你能详细说明一下吗。lambda 文件夹下的每个子文件夹都是相互独立的,并且如果这是运行 terraform 项目的意思,那么每个子文件夹都有自己的状态文件。我在 main.tf 的配置文件下面创建了。现在当我做 terraform计划...它创建一个新的 lambda 函数。它不应该指向现有的。提供者 "aws" { region = "us-east-2" } 模块 "test" { source = "../validate" }
    • 可以将有效的 terraform 项目作为模块导入并运行如果您更改运行的项目,您将使用新的状态文件重新开始。您可以使用terraform import 更新状态文件以包含现有项目。对于您那里的代码,您将导入到module.test.aws_lambda_function.<name in your module> 看看您是否可以使用您的文件夹之一,然后构建。
    • 我编辑了我的帖子以包含我在导入时遇到的代码和错误
    • 您需要将后端配置移动到 terraform 项目的根目录。此外,您的资源地址似乎需要更新。资源地址应指向模块中的实际 lambda 资源 - 您可以从模块代码中找到它。
    猜你喜欢
    • 2019-11-04
    • 2023-03-03
    • 2021-07-26
    • 1970-01-01
    • 2018-09-10
    • 2021-10-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多