Terraform IaC 文件 - AWS Proton

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Terraform IaC 文件

学习如何使用 Terraform 基础设施即代码 (IaC) 文件。 AWS ProtonTerraform 是一个广泛使用的开源 IaC 引擎,由开发。HashiCorpTerraform 模块是用 HCL 语言开发 HashiCorp的,支持包括亚马逊 Web Services 在内的多个后端基础设施提供商。

AWS Proton 支持 Terraform IaC 的自我管理配置

有关响应拉取请求并实现基础架构配置的配置存储库的完整示例,请参阅上的 Terraform Acti OpenSource GitHub ons 自动化模板。 AWS Proton GitHub

自托管式预置如何使用 Terraform IaC 模板捆绑包文件:
  1. 使用 Terraform 模板包创建环境时,使用控制台或输入参数 AWS Proton 编译.tf文件。spec file

  2. 它发出拉取请求,将编译的 IaC 文件合并到您在 AWS Proton中注册的存储库

  3. 如果请求获得批准,则 AWS Proton 等待您提供的配置状态。

  4. 如果拒绝了该请求,则取消创建环境。

  5. 如果拉取请求超时,则不会 完成创建环境。

AWS Proton 考虑到 Terraform IaC 的注意事项:
  • AWS Proton 无法管理你的 Terraform 配置。

  • 您必须向注册配置存储库 AWS Proton。 AWS Proton 对该存储库发出拉取请求。

  • 您必须创建 CodeStar 连接才能连接到 AWS Proton 您的配置存储库。

  • 要从 AWS Proton 已编译的 IaC 文件中进行配置,您必须响应 AWS Proton 拉取请求。 AWS Proton 在环境和服务创建和更新操作之后发出拉取请求。有关更多信息,请参阅 AWS Proton 环境AWS Proton 服务

  • 要使用 AWS Proton 已编译的 IaC 文件配置管道,必须创建 CI/CD 管道存储库。

  • 基于拉取请求的配置自动化必须包括通知 AWS Proton 任何已配置 AWS Proton 资源状态变化的步骤。你可以使用 AWS Proton NotifyResourceDeploymentStatusChange API

  • 您无法将从 CloudFormation IaC 文件创建的服务、管道和组件部署到通过 Terraform iaC 文件创建的环境中。

  • 您无法将从 Terraform IaC 文件创建的服务、管道和组件部署到通过 IaC 文件创建的环境中。 CloudFormation

在准备 Terraform IaC 文件时 AWS Proton,需要将命名空间附加到输入变量,如以下示例所示。有关更多信息,请参阅参数

terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 3.0" } } // This tells terraform to store the state file in s3 at the location // s3://terraform-state-bucket/tf-os-sample/terraform.tfstate backend "s3" { bucket = "terraform-state-bucket" key = "tf-os-sample/terraform.tfstate" region = "us-east-1" } } // Configure the AWS Provider provider "aws" { region = "us-east-1" default_tags { tags = var.proton_tags } } resource "aws_ssm_parameter" "my_ssm_parameter" { name = "my_ssm_parameter" type = "String" // Use the Proton environment.inputs. namespace value = var.environment.inputs.ssm_parameter_value }

编译的基础设施即代码

创建环境或服务时,使用控制台或spec file输入将基础架构 AWS Proton 编译为代码文件。它为 Terraform 可使用的输入创建 proton.resource-type.variables.tfproton.auto.tfvars.json 文件,如以下示例中所示。这些文件位于指定存储库中与环境或服务实例名称匹配的文件夹中。

该示例显示了如何在变量定义和变量值中 AWS Proton 包含标签,以及如何将这些 AWS Proton 标签传播到已配置的资源。有关更多信息,请参阅标签传播到预置的资源

dev/environment.tf:

terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 3.0" } } // This tells terraform to store the state file in s3 at the location // s3://terraform-state-bucket/tf-os-sample/terraform.tfstate backend "s3" { bucket = "terraform-state-bucket" key = "tf-os-sample/terraform.tfstate" region = "us-east-1" } } // Configure the AWS Provider provider "aws" { region = "us-east-1" default_tags { tags = var.proton_tags } } resource "aws_ssm_parameter" "my_ssm_parameter" { name = "my_ssm_parameter" type = "String" // Use the Proton environment.inputs. namespace value = var.environment.inputs.ssm_parameter_value }

dev/proton.environment.variables.tf:

variable "environment" { type = object({ inputs = map(string) name = string }) } variable "proton_tags" { type = map(string) default = null }

dev/proton.auto.tfvars.json:

{ "environment": { "name": "dev", "inputs": { "ssm_parameter_value": "MyNewParamValue" } } "proton_tags" : { "proton:account" : "123456789012", "proton:template" : "arn:aws:proton:us-east-1:123456789012:environment-template/fargate-env", "proton:environment" : "arn:aws:proton:us-east-1:123456789012:environment/dev" } }

存储库路径

AWS Proton 使用来自环境或服务创建操作的控制台或规范输入来找到已编译的 IaC 文件的存储库和路径。输入值将传递到命名空间输入参数

AWS Proton 支持两种存储库路径布局。在以下示例中,路径是由两个环境中的命名空间资源参数命名的。每个环境具有两个服务的服务实例,其中的一个服务的服务实例具有直接定义的组件。

资源类型 名称参数 = 资源名称
环境 environment.name = "env-prod"
环境 environment.name "env-staged"
服务 service.name "service-one"
  服务实例 service_instance.name "instance-one-prod"
  服务实例 service_instance.name "instance-one-staged"
服务 service.name "service-two"
  服务实例 service_instance.name "instance-two-prod"
    组件 service_instance.components.default.name "component-prod"
  服务实例 service_instance.name "instance-two-staged"
    组件 service_instance.components.default.name "component-staged"
Layout 1

如果 AWS Proton 找到带有environments文件夹的指定存储库,它将创建一个包含已编译的 IaC 文件并以命名的文件夹。environment.name

如果在指定的存储库中 AWS Proton 找到的environments文件夹包含与服务实例兼容环境名称相匹配的文件夹名称,则它会创建一个包含已编译的实例 IaC 文件并以命名的文件夹。service_instance.name

/repo /environments /env-prod # environment folder main.tf proton.environment.variables.tf proton.auto.tfvars.json /service-one-instance-one-prod # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /service-two-instance-two-prod # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /component-prod # component folder main.tf proton.component.variables.tf proton.auto.tfvars.json /env-staged # environment folder main.tf proton.variables.tf proton.auto.tfvars.json /service-one-instance-one-staged # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /service-two-instance-two-staged # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /component-staged # component folder main.tf proton.component.variables.tf proton.auto.tfvars.json
Layout 2

如果 AWS Proton 找到没有environments文件夹的指定存储库,它将创建一个文件environment.name夹,用于查找已编译的环境 IaC 文件。

如果 AWS Proton 找到的指定存储库的文件夹名称与服务实例兼容的环境名称相匹配,它将创建一个service_instance.name文件夹,用于查找已编译的实例 IaC 文件。

/repo /env-prod # environment folder main.tf proton.environment.variables.tf proton.auto.tfvars.json /service-one-instance-one-prod # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /service-two-instance-two-prod # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /component-prod # component folder main.tf proton.component.variables.tf proton.auto.tfvars.json /env-staged # environment folder main.tf proton.variables.tf proton.auto.tfvars.json /service-one-instance-one-staged # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /service-two-instance-two-staged # instance folder main.tf proton.service_instance.variables.tf proton.auto.tfvars.json /component-staged # component folder main.tf proton.component.variables.tf proton.auto.tfvars.json