翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AFT AWS アカウント を使用して新しい の Amazon VPC IPAM IPv4 CIDR 割り当てを自動化する
Amazon Web Services、Kien Pham、Alex Pazik
概要
このパターンは、Account Factory for Terraform (AFT) AWS アカウント を使用して、新しい の Amazon VPC IP Address Manager (IPAM) IPv4 CIDR 割り当てを自動化する方法を示しています。 AWS Control Towerこの作業は、aft-account-customizations モジュールを使用して IPAM から新しい仮想プライベートクラウド (VPC) に IPv4 CIDR ブロックを割り当てる、アカウントレベルのカスタマイズを使用して行われます。
IPAM を使用すると、IP アドレスを大規模に整理、割り当て、モニタリング、監査できるため、 AWS ワークロードの IP アドレスを簡単に計画、追跡、モニタリングできます。アカウントベンディングの処理中に IPv4 CIDR ブロックを新しい VPC に割り当てる際に使用する、IPAM を作成し IPAM プールを作成することができます。
前提条件と制限
前提条件
サポートされている で AWS Control Tower 有効 AWS アカウント になっているアクティブな AWS リージョンと、デプロイされた AFT
サポートされているバージョン管理システム (VCS) プロバイダー (BitBucket、GitHub、GitHub Enterprise など)。
Terraform コマンドラインインターフェイス (CLI) をインストール済み。
AFT をインストールする Terraform モジュールを実行できるランタイム環境。
AWS Command Line Interface (AWS CLI) のインストールと設定
制限事項
製品バージョン
アーキテクチャ
次の図は、このパターンのワークフローとコンポーネントを示しています。
ワークフローは、主に次のタスクから構成されています。
トリガーの変更 – Terraform と IPAM のカスタマイズへの変更は GitHub リポジトリにコミットされてプッシュされます。このタスクは AWS CodeBuild パイプラインを自動的にトリガーします。
ビルドの自動化 – CodeBuild 内では、複数のビルドプロジェクトがトリガーされます AWS Step Functions。
カスタマイズの適用 – Step Functions は CodeBuild と連携して、Terraform の変更を計画して適用します。このタスクでは、AFT Terraform モジュールを使用して、提供されたアカウントへの IPAM プールの IP AWS 割り当てを調整します。
AWS のサービス
AWS CodeBuild は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。
AWS CodePipeline は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。
AWS Control Tower は、 AWS Organizations AWS Service Catalogや などAWS のサービス、他のいくつかの の機能を調整します AWS IAM アイデンティティセンター。これは、規範的なベストプラクティスに従って、 AWS マルチアカウント環境のセットアップと管理に役立ちます。
Amazon DynamoDB は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
AWS SDK for Python (Boto3) は、Python アプリケーション、ライブラリ、またはスクリプトを と統合するのに役立つソフトウェア開発キットです AWS のサービス。
AWS Service Catalog では、承認された IT サービスのカタログを一元管理できます AWS。エンドユーザーは、組織によって設定された制約に従って、必要な承認済みの IT サービスのみをすばやくデプロイできます。
AWS Step Functions は、 AWS Lambda 関数やその他の を組み合わせてビジネスクリティカルなアプリケーション AWS のサービス を構築するのに役立つサーバーレスオーケストレーションサービスです。
Amazon Virtual Private Cloud (Amazon VPC) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。Amazon VPC IP Address Manager (IPAM) は、 AWS ワークロードの IP アドレスの計画、追跡、モニタリングを容易にする VPC 機能です。
その他のツール
GitHub は、開発者がコードの作成、保存、管理、共有に使用できる開発者用プラットフォームです。
HashiCorp Terraformは、Infrastructure as Code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。これには、コンピューティングインスタンス、ストレージ、ネットワークなどの低レベルコンポーネント、DNS エントリや Software a Service (SaaS) 機能などの高レベルコンポーネントが含まれます。
「Python」は汎用のコンピュータプログラミング言語です。こちらを使用すると、AWS クラウド でのアプリケーションの構築、タスクの自動化、サービスの開発を行うことができます。
コードリポジトリ
ベストプラクティス
AFT をデプロイするときは、安全かつ効率的に実装を完了するために、ベストプラクティスに従うことが推奨されます。AFT の実装と運用に関する主要なガイドラインおよび推奨事項は次のとおりです。
入力の徹底した確認– 入力を毎回注意深く確認し理解します。AFT を設定し正しく機能させるには正確な入力設定が不可欠です。
テンプレートの定期的な更新 — テンプレートを最新の AWS 機能と Terraform バージョンで更新します。定期的に更新することで新機能を活用しセキュリティを維持することができます。
バージョニング – AFT モジュールのバージョンを固定し、可能であれば別の AFT デプロイを使用してテストします。
スコープ – AFT は、インフラストラクチャのガードレールとカスタマイズをデプロイするためにのみ使用します。アプリケーションのデプロイには使用しないでください。
リンティングと検証 – AFT パイプラインには、リンティングおよび検証済みの Terraform 設定が必要です。この設定を AFT リポジトリにプッシュする前に、リンティング、検証、テストを実行します。
Terraform モジュール – 再利用可能な Terraform コードをモジュールとして構築し、常に組織の要件に合わせて Terraform と AWS プロバイダーのバージョンを指定します。
エピック
| タスク | 説明 | 必要なスキル |
|---|
IPAM の管理者として委任する | AWS 組織内の IPAM 管理者アカウントを委任するには、次の手順を実行します。 AWS Organizations 管理アカウントを使用して、https://console.aws.amazon.com/ipam/ で IPAM コンソールを開きます。 AWS リージョン で AWS マネジメントコンソール、IPAM を操作する を選択します。 ナビゲーションペインで [組織の設定] を選択します。 [委任] を選択します。委任オプションは、 AWS Organizations 管理アカウントとしてコンソールにサインインした場合にのみ使用できます。 IPAM アカウントの AWS アカウント ID を入力します。IPAM 管理者は AWS Organizations メンバーアカウントに属している必要があります。 [Save changes] (変更の保存) をクリックします。
または、 を使用して次のコマンド AWS CLI を実行できます。 aws ec2 enable-ipam-organization-admin-account \
--delegated-admin-account-id 012345678901
詳細については、「Amazon VPC ドキュメント」の「IPAM を AWS 組織内のアカウントと統合する」および AWS CLI 「 コマンドリファレンス」のenable-ipam-organization-admin-account」を参照してください。 引き続き IPAM を使用するには、委任管理者用アカウントにサインインする必要があります。次のステップで指定する SSO プロファイルまたは AWS 環境変数では、そのアカウントにサインインし、IPAM トップレベルおよびリージョンプールを作成するアクセス許可を付与する必要があります。 | AWS 管理者 |
IPAM の最上位プールとリージョンプールを作成します。 | 本パターンの GitHub リポジトリには、IPAM 最上位プールとリージョンプールの作成に使用できる Terraform テンプレートが含まれています。その後、 AWS Resource Access Manager () を使用して、プールを組織、組織単位 (OU) AWS アカウント、またはその他のリソースと共有できますAWS RAM。 以下のステップを使用します。 以下の コマンドを実行します。 # Navigate to the IPAM module
cd ipam/terraform
# Initiate the IPAM module
terraform init
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 マネジメントコンソールから取得できます。 作成したプールの CIDR が、使用中のリージョンの他のプールと重複していないことを確認します。CIDR なしでプールを作成することもできますが、CIDR をプロビジョニングするまで、そのプールを割り当てに使用することはできません。プールを編集することで、いつでも CIDR をプールに追加できます。 | AWS 管理者 |
| タスク | 説明 | 必要なスキル |
|---|
アカウントのカスタマイズの作成を開始します。 | 新しいアカウントのカスタマイズを開始するには、ターミナルから次のコマンドを実行します。 # 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 ファイルを作成します。
| 動的コードを、使用する Terraform バックエンドとプロバイダーを指定する aft-providers.jinja ファイルに追加します。 以下のステップを使用します。 terraform ディレクトリ内に新しい aft-providers.jinja ファイルを作成します。
ファイルを開き、次のコードを追加して、ファイルを保存します。 provider "aws" {
region = "{{ provider_region }}"
assume_role {
role_arn = "{{ target_admin_role_arn }}"
}
default_tags {
tags = {
managed_by = "AFT"
}
}
}
| DevOps エンジニア |
backend.jinja ファイルを作成します。
| 動的コードを、使用する Terraform バックエンドとプロバイダーを指定する backend.jinja ファイルに追加します。 以下のステップを使用します。 terraform ディレクトリ内に新しい backend.jinja ファイルを作成します。
ファイルを開き、次のコードを追加して、ファイルを保存します。 ## 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) から 2 つの値を取得して VPC を作成する 2 つのデータソースを定義するコードを追加します。 以下のステップを使用します。 terraform ディレクトリ内に新しい main.tf ファイルを作成します。
ファイルを開き、次のコードを追加して、ファイルを保存します。 # 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 ファイルを作成します。 以下のステップを使用します。 terraform ディレクトリ内に新しい variables.tf ファイルを作成します。
ファイルを開き、次のコードを追加して、ファイルを保存します。 # 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 ファイルを作成します。
| main.tf ファイルに渡される変数の値を定義する terraform.tfvars ファイルを作成します。
以下のステップを使用します。 terraform ディレクトリ内に新しい terraform.tfvars ファイルを作成します。
ファイルを開き、次のコードを追加して、ファイルを保存します。 name = "demo-ipam"
enable_ipv6 = false
enable_dns_hostnames = true
enable_dns_support = true
| DevOps エンジニア |
outputs.tf ファイルを作成します。
| CodeBuild でいくつかの値を公開する新しい outputs.tf ファイルを作成します。 以下のステップを使用します。 terraform ディレクトリ内に新しい outputs.tf ファイルを作成します。
ファイルを開き、次のコードを追加して、ファイルを保存します。 # 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 ファイルに追加します。カスタムフィールドは、適切な IPAM 割り当て IPv4 CIDR を持つ VPC を作成するために必要なベンディングアカウントに、Systems Manager パラメータを作成します。 以下のステップを使用します。 お使いのターミナルから aft-account-request/terraform ディレクトリに移動します。 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 以下であり、VPC に割り当てるのに十分な IP が IPAM プールにあることを確認します。 新しいアカウントをアカウントリクエストリポジトリにコミットするには、次のコマンドを使用します。 git add .
git commit -m 'requested APG account'
git push origin
| AWS DevOps |
カスタマイズを検証します。 | 新しいベンディングアカウントにサインインし、カスタマイズが正常に適用されたことを確認します。 以下のステップを使用します。 AWS IAM アイデンティティセンター サインインページを開き、 account-requests.tf ファイルで指定したユーザーとして認証します。 IAM Identity Center アカウントリストから、以前に購入したアカウントを選択し、ロールを使用してサインインします AWS AdministratorAccess。 VPC コンソールに移動し、[お使いの VPC] を選択します。 先ほど作成した VPC の VPC ID を選択します。 [CIDRs] (CIDR) タブを選択します。IPAM に割り当てられた IPv4 CIDR が表示されます。 (オプション) IPAM 委任管理者アカウントにサインインし、割り当てが IPAM コンソールに表示されることを確認します。
| DevOps エンジニア |
トラブルシューティング
| 問題 | ソリューション |
|---|
アクセス権限が不十分であるためリソースの作成または管理に障害が発生した。 | Step Functions、CodeBuild、およびデプロイに関連するその他のサービスにアタッチされている AWS Identity and Access Management (IAM) ロールとポリシーを確認します。必要なアクセス権限があることを確認します。アクセス権限に問題がある場合は、IAM ポリシーを調整して必要なアクセス許可を付与します。 |
デプロイ中に AWS のサービス クォータに達します。 | パイプラインをデプロイする前に、Amazon Simple Storage Service (Amazon S3) AWS のサービス バケット、IAM ロール、 AWS Lambda 関数などのリソースのクォータを確認します。必要に応じて、クォータの増加をリクエストします。詳細については、「AWS 全般リファレンス」の「AWS のサービス Quotas」を参照してください。 |
関連リソース
AWS のサービス ドキュメント
その他のリソース