使用 AFT 自动为新 AWS 账户 用户分配 Amazon VPC IPAM IPv4 CIDR - AWS 规范指引

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

使用 AFT 自动为新 AWS 账户 用户分配 Amazon VPC IPAM IPv4 CIDR

Kien Pham 和 Alex Pazik,Amazon Web Services

Summary

此模式展示了如何使用适用于 T erraform 的 Account Factor AWS 账户 y (AFT) 自动为新AWS Control Tower 用户分配 Amazon VPC IP 地址管理器 (IPAM) IPv4 CIDR。这是通过账户级自定义来完成的,该自定义使用该模块将 IPAM 中的 IPv4 CIDR 块分配给新的虚拟私有云 (VPC)。aft-account-customizations

借助 IPAM,您可以大规模组织、分配、监控和审计 IP 地址,从而轻松规划、跟踪和监控工作负载的 IP 地址。 AWS 您可以创建 IPAM 和 IPAM 池,用于在账户出售过程中向新 VPC 分配 IPv4 CIDR 块。

先决条件和限制

先决条件

  • 在支持AWS 区域中 AWS Control Tower 启用 AWS 账户 且已部署 AFT 的情况下处于活动状态

  • 支持的版本控制系统 (VCS) 提供商 BitBucket,例如 GitHub、和 GitHub Enterprise

  • 安装了 Terraform 命令行界面(CLI)

  • 一个运行时环境,您可以在其中运行安装 AFT 的 Terraform 模块

  • AWS Command Line Interface (AWS CLI) 已安装配置

限制

产品版本

  • AWS Control Tower l@@ anding zon e 版本 3.0 或更高版本,低于 4.0 版本

  • AFT 1.13.0 或更高版本,低于 2.0.0 版

  • Terraform OSS 1.2.0 或更高版本,低于 2.0.0 版

  • Terraform Prov AWS id er (terraform-provider-aws) 版本 5.11.0 或更高版本,早于 6.0.0 版本

  • Terraform module for IPAMaws-ia/ipam/aws)版本 2.1.0 或更高版本

架构

下图显示了此模式的工作流和组件。

创建 Amazon VPC IPAM IPv4 CIDR 分配的工作流程。

该工作流包含以下主要任务:

  1. 触发器更改 — 对 Terraform 和 IPAM 自定义的更改已提交到存储库并推送。 GitHub 此任务会自动触发 AWS CodeBuild 管道。

  2. 自动构建-在内部 CodeBuild触发多个构建项目 AWS Step Functions。

  3. 应用自定义 — Step Functions 与 CodeBuild 之协调以计划和应用 Terraform 的更改。此任务使用 AFT Terraform 模块来协调 IPAM 池 IP 分配给卖方账户。 AWS

工具

AWS 服务

  • AWS CodeBuild 是一项完全托管式构建服务,可编译源代码、运行单元测试和生成部署就绪的构件。

  • AWS CodePipeline 可帮助您快速对软件发布过程的不同阶段进行建模和配置,并自动执行持续发布软件变更所需步骤。

  • AWS Control Tower协调其他几种能力 AWS 服务,包括 AWS Organizations AWS Service Catalog、和。 AWS IAM Identity Center它可以帮助您按照规范性最佳实践设置和管理 AWS 多账户环境。

  • Amazon DynamoDB 是一项完全托管式 NoSQL 数据库服务,可提供快速、可预测、可扩展的性能。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。

  • 适用于 Python (Boto3) 的 AWS SDK是一个软件开发套件,可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。

  • AWS Service Catalog帮助您集中管理已获批准的 IT 服务目录。 AWS最终用户可在遵循组织设定约束的情况下快速部署他们所需已获得批准的 IT 服务。

  • AWS Step Functions是一项无服务器编排服务,可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。

  • Amazon Virtual Private Cloud(亚马逊 VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS的可扩展基础设施的优势。Amazon VPC IP 地址管理器 (IPAM) 是一项 VPC 功能,可让您更轻松地规划、跟踪和监控工作负载的 IP 地址。 AWS

其他工具

  • GitHub是一个开发者平台,开发人员可以使用它来创建、存储、管理和共享他们的代码。

  • HashiCorp Terraform 是一款基础设施即代码 (IaC) 工具,可帮助您创建和管理云和本地资源。其中包括计算实例、存储和联网等低级组件;以及 DNS 条目和软件即服务(SaaS)功能等高级组件。

  • Python 是一种通用的计算机编程语言。您可以使用它在 AWS 云 上构建应用程序、自动执行任务和开发服务。

代码存储库

最佳实践

当您部署 AFT 时,我们建议您遵循最佳实践,以帮助确保实现安全、高效且成功的实施。实施和运行 AFT 的主要指导原则和建议包括以下内容:

  • 全面审查输入 – 仔细审查并理解每个输入。正确的输入配置对于 AFT 的设置和运行至关重要。

  • 定期更新模板 — 使用最新 AWS 功能和 Terraform 版本更新模板。定期更新可帮助您充分利用新功能并维护安全性。

  • 版本控制 – 如果可能,请保持 AFT 模块版本不变,并使用单独的 AFT 部署进行测试。

  • 范围 – 仅使用 AFT 来部署基础设施护栏和自定义。切勿使用它来部署应用程序。

  • 检查和验证– AFT 管道需要经过检查和验证的 Terraform 配置。在将配置推送到 AFT 存储库之前,运行检查、验证和测试。

  • Terraform 模块 — 将可重复使用的 Terraform 代码构建为模块,并始终指定 Terraform 和 AWS 提供者版本以满足组织的要求。

操作说明

Task说明所需技能

部署 AWS Control Tower。

在您的环境 AWS Control Tower 中进行设置和配置,以确保对您的 AWS 环境进行集中管理和治理 AWS 账户。有关更多信息,请参阅 AWS Control Tower 文档 AWS Control Tower中的入门

云管理员

部署 Ac AWS Control Tower count Factory for Terraform (AFT)。

在新的专用 AFT 管理账户中设置 AFT。有关更多信息,请参阅 C 配置并在文档中启动 Terraform 的 Ac AWS Control Tower count Factory。 AWS Control Tower

云管理员

完成 AFT 部署后操作。

AFT 基础设施部署完成后,完成 AWS Control Tower 文档中部署后步骤中的步骤

云管理员
Task说明所需技能

委派 IPAM 管理员。

要在您的 AWS 组织中委派 IPAM 管理员帐户,请使用以下步骤:

  1. 使用 AWS Organizations 管理账户,打开 IPAM 控制台,网址为。https://console.aws.amazon.com/ipam/

  2. 在中 AWS 管理控制台,选择要 AWS 区域 在其中使用 IPAM 的。

  3. 在导航面板中选择组织设置

  4. 选择 Delegate(委派)。只有当您以 AWS Organizations 管理账户身份登录控制台时,“委托” 选项才可用。

  5. 输入 IPAM 账户的 AWS 账户 ID。IPAM 管理员必须使用 AWS Organizations 成员账户。

  6. 选择保存更改

或者,您可以使用 AWS CLI 并运行以下命令:

aws ec2 enable-ipam-organization-admin-account \ --delegated-admin-account-id 012345678901

有关更多信息,请参阅 Amazon V PC 文档中的 IPAM 与 AWS 组织中的账户集成,以及命令参考中的 enable-ipam-organization-admin-acco unt。 AWS CLI

重要

要继续使用 IPAM,您必须登录委托管理员账户。下一步中指定的 SSO 配置文件或 AWS 环境变量必须允许您登录该账户并授予创建 IPAM 顶级池和区域池的权限。

AWS 管理员

创建 IPAM 顶级池和区域池。

此模式的 GitHub 存储库包含一个 Terraform 模板,您可以使用该模板来创建 IPAM 顶级池和区域池。然后,您可以使用 AWS Resource Access Manager () 与组织、组织单位 (OU) 或其他资源共享资源池。 AWS 账户AWS RAM

使用以下步骤:

  1. 运行以下 命令:

    # Navigate to the IPAM module cd ipam/terraform # Initiate the IPAM module terraform init
  2. 打开 main.tf 文件,按照以下注释中的说明修改代码,然后保存该文件。

    terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 5.11.0, < 6.0.0" } } } provider "aws" { region = "us-east-1" # Replace with the region to create your top-level pool } module "ipam" { source = "aws-ia/ipam/aws" version = ">= 2.1.0" top_name = "my-top-level-pool" # Replace with your desired top-level pool name top_description = "top-level pool" # Replace with your desired top-level level pool description top_cidr = ["10.0.0.0/16"] # Replace with your desired top-level pool CIDR pool_configurations = { my-regional-pool = { # (Optional) Replace with a different resource name name = "my-regional-pool" # Replace with your desired pool name description = "regional pool" # Replace with your desired pool description cidr = ["10.0.0.0/23"] # Replace with your desired pool CIDR locale = "us-east-1" # Replace with your desired pool locale ram_share_principals = ["arn:aws:organizations::012345678901:ou/ou-ab1c2de345/ou-ab1c2de345"] # Replace with your desired principal ARN to share with via Resource Access Manager (RAM) } } } output "my_regional_pool_id" { description = "The ID of the regional pool" value = module.ipam.pools_level_1["my-regional-pool"].id # Replace with your desired resource name if changed above } # Create the IPAM top-level and resource pool terraform apply

记下创建后输出的资源池 ID。提交账户申请时您将需要此 ID。如果忘记了资源池 ID,可以稍后从 AWS 管理控制台中获取。

重要

确保创建的池 CIDRs 不会与工作区域中的任何其他池重叠。您可以在没有 CIDR 的情况下创建池,但是在为该池预置 CIDR 之前,您将无法使用该池进行分配。您可以随时通过编辑池 CIDRs 来将其添加到池中。

AWS 管理员
Task说明所需技能

开始创建账户自定义。

要开始自定义新账户,请在终端上运行以下命令:

# Default name for customization repo cd aft-account-customizations # Replace with your actual repo name if different than the default mkdir -p APG-AFT-IPAM/terraform # Replace APG-AFT-IPAM with your desired customization name cd APG-AFT-IPAM/terraform
DevOps 工程师

创建 aft-providers.jinja 文件。

aft-providers.jinja 文件中添加动态代码,指定要使用的 Terraform 后端和提供程序。

使用以下步骤:

  1. terraform 目录中创建新 aft-providers.jinja 文件。

  2. 打开文件,添加以下代码,然后保存文件。

    provider "aws" { region = "{{ provider_region }}" assume_role { role_arn = "{{ target_admin_role_arn }}" } default_tags { tags = { managed_by = "AFT" } } }
DevOps 工程师

创建 backend.jinja 文件。

backend.jinja 文件中添加动态代码,指定要使用的 Terraform 后端和提供程序。

使用以下步骤:

  1. terraform 目录中创建新 backend.jinja 文件。

  2. 打开文件,添加以下代码,然后保存文件。

    ## Auto generated backend.tf ## ## Updated on: {{ timestamp }} ## {% if tf_distribution_type == "oss" -%} terraform { required_version = ">= {{ tf_version }}" backend "s3" { region = "{{ region }}" bucket = "{{ bucket }}" key = "{{ key }}" dynamodb_table = "{{ dynamodb_table }}" encrypt = "true" kms_key_id = "{{ kms_key_id }}" role_arn = "{{ aft_admin_role_arn }}" } } {% else -%} terraform { backend "remote" { organization = "{{ terraform_org_name }}" workspaces { name = "{{ terraform_workspace_name }}" } } } {% endif %}
DevOps 工程师

创建 main.tf 文件。

创建一个新main.tf文件并添加用于定义两个数据源的代码,这些数据源从 AWS Systems Manager (aws_ssm) 中检索两个值并创建 VPC。

使用以下步骤:

  1. terraform 目录中创建新 main.tf 文件。

  2. 打开文件,添加以下代码,然后保存文件。

    # Define data sources data "aws_ssm_parameter" "vpc_ipam_id" { name = "/aft/account-request/custom-fields/vpc-ipam-id" # Value is defined in the account-request.tf file } data "aws_ssm_parameter" "vpc_netmask" { name = "/aft/account-request/custom-fields/vpc-ipam-netmask" # Value is defined in the account-request.tf file } # Create new VPC resource "aws_vpc" "vpc1" { ipv4_ipam_pool_id = data.aws_ssm_parameter.vpc_ipam_id.value # Retrieved from SSM - this is how we integrate with IPAM ipv4_netmask_length = data.aws_ssm_parameter.vpc_netmask.value # Retrieved from SSM assign_generated_ipv6_cidr_block = var.enable_ipv6 ? true : null ipv6_cidr_block = var.ipv6_cidr ipv6_ipam_pool_id = var.ipv6_ipam_pool_id ipv6_netmask_length = var.ipv6_netmask_length ipv6_cidr_block_network_border_group = var.ipv6_cidr_block_network_border_group instance_tenancy = var.instance_tenancy enable_dns_hostnames = var.enable_dns_hostnames enable_dns_support = var.enable_dns_support enable_network_address_usage_metrics = var.enable_network_address_usage_metrics tags = var.tags lifecycle { ignore_changes = [ tags, # Any changes made to VPC tags after creation will not be overwritten - remove to revert these changes during future 'terraform apply' operations ] } }
DevOps 工程师

创建 variables.tf 文件。

创建一个声明 Terraform 模块所用变量的 variables.tf 文件。

使用以下步骤:

  1. terraform 目录中创建新 variables.tf 文件。

  2. 打开文件,添加以下代码,然后保存文件。

    # Copied from AWS VPC module # https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/variables.tf variable "name" { description = "Name to be used on all the resources as identifier" type = string default = "" } variable "enable_ipv6" { description = "Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IP addresses, or the size of the CIDR block" type = bool default = false } variable "ipv6_cidr" { description = "(Optional) IPv6 CIDR block to request from an IPAM Pool. Can be set explicitly or derived from IPAM using `ipv6_netmask_length`" type = string default = null } variable "ipv6_ipam_pool_id" { description = "(Optional) IPAM Pool ID for a IPv6 pool. Conflicts with `assign_generated_ipv6_cidr_block`" type = string default = null } variable "ipv6_netmask_length" { description = "(Optional) Netmask length to request from IPAM Pool. Conflicts with `ipv6_cidr_block`. This can be omitted if IPAM pool as a `allocation_default_netmask_length` set. Valid values: `56`" type = number default = null } variable "ipv6_cidr_block_network_border_group" { description = "By default when an IPv6 CIDR is assigned to a VPC a default ipv6_cidr_block_network_border_group will be set to the region of the VPC. This can be changed to restrict advertisement of public addresses to specific Network Border Groups such as LocalZones" type = string default = null } variable "instance_tenancy" { description = "A tenancy option for instances launched into the VPC" type = string default = "default" } variable "enable_dns_hostnames" { description = "Should be true to enable DNS hostnames in the VPC" type = bool default = true } variable "enable_dns_support" { description = "Should be true to enable DNS support in the VPC" type = bool default = true } variable "enable_network_address_usage_metrics" { description = "Determines whether network address usage metrics are enabled for the VPC" type = bool default = null } variable "tags" { description = "A map of tags to add to all resources" type = map(string) default = {} }
DevOps 工程师

创建 terraform.tfvars 文件。

创建一个定义传递给该 terraform.tfvars 文件的变量值的 main.tf 文件。

使用以下步骤:

  1. terraform 目录中创建新 terraform.tfvars 文件。

  2. 打开文件,添加以下代码,然后保存文件。

    name = "demo-ipam" enable_ipv6 = false enable_dns_hostnames = true enable_dns_support = true
DevOps 工程师

创建 outputs.tf 文件。

创建一个新outputs.tf文件,其中会显示一些值。 CodeBuild

使用以下步骤:

  1. terraform 目录中创建新 outputs.tf 文件。

  2. 打开文件,添加以下代码,然后保存文件。

    # Output VPC ID and ARN in CodeBuild output "vpc1" { description = "VPC 1 information" value = { id = try(aws_vpc.vpc1.id, null) arn = try(aws_vpc.vpc1.arn, null) } }
DevOps 工程师

提交自定义。

要将新自定义内容提交到账户自定义存储库,请运行以下命令:

# Assumes you are still in the /terraform directory cd .. # Skip if you are in the account customization root directory (APG-AFT-IPAM) git add . git commit -m "APG customization" git push origin
DevOps 工程师

应用自定义。

account-requests.tf 文件中添加代码,请求使用新创建的账户自定义项开设新账户。自定义字段在销售账户中创建 Systems Manager 参数,这些参数是使用正确的 IPAM 分配的 CIDR 创建 VPC 所必需的。 IPv4

使用以下步骤:

  1. 从您的终端中,导航到 aft-account-request/terraform 目录。

  2. 打开 account-requests.tf 文件,使用您的值添加和修改以下代码,然后保存该文件。

    module "sandbox_account_01" { source = "./modules/aft-account-request" control_tower_parameters = { AccountEmail = "john.doe@example.com" AccountName = "sandbox-account-01" # Syntax for top-level OU ManagedOrganizationalUnit = "Sandbox" # Syntax for nested OU # ManagedOrganizationalUnit = "Sandbox (ou-xfe5-a8hb8ml8)" SSOUserEmail = "john.doe@example.com" SSOUserFirstName = "John" SSOUserLastName = "Doe" } account_tags = { "ABC:Owner" = "john.doe@example.com" "ABC:Division" = "ENT" "ABC:Environment" = "Dev" "ABC:CostCenter" = "123456" "ABC:Vended" = "true" "ABC:DivCode" = "102" "ABC:BUCode" = "ABC003" "ABC:Project" = "123456" } change_management_parameters = { change_requested_by = "John Doe" change_reason = "testing the account vending process" } custom_fields = { vpc-ipam-id = "ipam-pool-123456ab789041cd2" vpc-ipam-netmask = "24" } account_customizations_name = "APG-AFT-IPAM" # Do not change this value }
    重要

    确保该vpc-ipam-netmask值小于或等于 IPAM 池分配netmask,并且 IPAM 池中有足够的 IPs 可用资源分配给 VPC。

  3. 要将新账户提交到账户请求存储库,请使用以下命令:

    git add . git commit -m 'requested APG account' git push origin
AWS DevOps

验证自定义。

登录新分配的账户,并验证自定义设置已成功应用。

使用以下步骤:

  1. 打开您的 AWS IAM Identity Center 登录页面并以您在account-requests.tf文件中指定的用户身份进行身份验证。

  2. 从 IAM Identity Center 账户列表中,选择您之前出售的账户,然后使用该 AWS AdministratorAccess角色登录。

  3. 导航到 VPC 控制台,然后选择您的 VPCs

  4. 选择您刚创建的 VPC 的 VPC ID。

  5. 选择 CIDRs 选项卡。您应该会看到 IPAM 分配的 CIDR IPv4 。

  6. (可选)登录您的 IPAM 委托管理员账户,并验证分配是否显示在 IPAM 控制台中。

DevOps 工程师

问题排查

问题解决方案

由于权限不足,您在创建或管理资源时遇到故障。

查看附加到 Step Functions 的 AWS Identity and Access Management (IAM) 角色和策略 CodeBuild,以及部署中涉及的其他服务。确认他们是否具有必要的权限 如果存在权限问题,请调整 IAM 策略,授予所需的访问权限。

您将在部署期间达到 AWS 服务 配额。

在部署管道之前,请检查诸如亚马逊简单存储服务 (Amazon S3) 存储桶、IAM 角色和函数等资源的 AWS 服务 配额。 AWS Lambda 如有必要,可请求增加到该配额。有关更多信息,请参阅《AWS 一般参考》中的AWS 服务 配额

相关资源

AWS 服务 文档

其他资源