AFT를 AWS 계정 사용하여 새에 대한 Amazon VPC IPAM IPv4 CIDR 할당 자동화 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AFT를 AWS 계정 사용하여 새에 대한 Amazon VPC IPAM IPv4 CIDR 할당 자동화

Kien Pham과 Alex Pazik, Amazon Web Services

요약

이 패턴은 AWS Control Tower Account Factory for Terraform(AFT)을 사용하여 새에 대한 Amazon VPC IP 주소 관리자(IPAM) IPv4 CIDR 할당 AWS 계정 을 자동화하는 방법을 보여줍니다. 이는 aft-account-customizations 모듈을 사용하여 IPAM에서 새 Virtual Private Cloud(VPC)로 IPv4 CIDR 블록을 할당하는 계정 수준 사용자 지정을 사용하여 수행됩니다.

IPAM을 사용하면 대규모로 IP 주소를 구성, 할당, 모니터링 및 감사할 수 있으므로 AWS 워크로드의 IP 주소를 쉽게 계획, 추적 및 모니터링할 수 있습니다. 계정 벤딩 프로세스 중에 IPv4 CIDR 블록을 새 VPC에 할당하는 데 사용할 IPAM 및 IPAM 풀을 생성할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 가 지원되는에서 AWS 계정 AWS Control Tower 활성화AWS 리전되고 AFT가 배포된 활성

  • BitBucket, GitHub 및 GitHub Enterprise와 같은 지원되는 버전 관리 시스템(VCS) 공급자

  • Terraform 명령줄 인터페이스(CLI) 설치

  • AFT를 설치하는 Terraform 모듈을 실행할 수 있는 런타임 환경

  • AWS Command Line Interface (AWS CLI) 설치구성

제한 사항

제품 버전

아키텍처

다음 다이어그램은 이 패턴의 워크플로 및 구성 요소를 보여 줍니다.

Amazon VPC IPAM IPv4 CIDR 할당을 생성하는 워크플로입니다.

워크플로우는 다음 기본 작업으로 구성됩니다.

  1. 변경 트리거 - Terraform 및 IPAM 사용자 지정에 대한 변경 사항은 GitHub 리포지토리에 커밋되고 푸시됩니다. 이 작업은 AWS CodeBuild 파이프라인을 자동으로 트리거합니다.

  2. 빌드 자동화 - CodeBuild 내에서 여러 빌드 프로젝트가 트리거됩니다 AWS Step Functions.

  3. 사용자 지정 적용 - Step Functions는 CodeBuild와 조정하여 Terraform 변경 사항을 계획하고 적용합니다. 이 작업은 AFT Terraform 모듈을 사용하여 AWS 판매 계정에 대한 IPAM 풀 IP 할당을 조정합니다.

도구

AWS 서비스

  • AWS CodeBuild는 소스 코드를 컴파일하고 유닛 테스트를 실행하며 배포할 준비가 완료된 아티팩트를 생성하는 완전 관리형 빌드 서비스입니다.

  • AWS CodePipeline은 소프트웨어 릴리스의 여러 단계를 신속하게 모델링하고 구성하고 소프트웨어 변경 내용을 지속적으로 릴리스하는 데 필요한 단계를 자동화합니다.

  • AWS Control Tower는 AWS Organizations AWS Service Catalog및를 AWS 서비스포함하여 다른 여러의 기능을 오케스트레이션합니다 AWS IAM Identity Center. 권장 모범 사례에 따라 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 주소 관리자(IPAM)는 AWS 워크로드의 IP 주소를 더 쉽게 계획, 추적 및 모니터링할 수 있는 VPC 기능입니다.

기타 도구

  • GitHub는 개발자가 코드를 생성, 저장, 관리 및 공유하는 데 사용할 수 있는 개발자 플랫폼입니다.

  • HashiCorp Terraform은 코드형 인프라(IaC) 도구로, 클라우드 및 온프레미스 리소스를 생성하고 관리하는 데 도움이 됩니다. 여기에는 컴퓨팅 인스턴스, 스토리지 및 네트워킹과 같은 하위 수준 구성 요소와 DNS 항목 및 서비스 소프트웨어(SaaS) 기능과 같은 상위 수준 구성 요소가 포함됩니다.

  • Python은 범용 컴퓨터 프로그래밍 언어입니다. 이를 사용하여 AWS 클라우드에서 애플리케이션을 구축하고, 작업을 자동화하고, 서비스를 개발할 수 있습니다.

코드 리포지토리

모범 사례

AFT를 배포할 때 안전하고 효율적이며 성공적인 구현을 보장하는 데 도움이 되는 모범 사례를 따르는 것이 좋습니다. AFT 구현 및 운영에 대한 주요 지침 및 권장 사항은 다음과 같습니다.

  • 입력에 대한 철저한 검토 - 각 입력을 신중하게 검토하고 이해합니다. 올바른 입력 구성은 AFT의 설정 및 작동에 매우 중요합니다.

  • 정기적인 템플릿 업데이트 - 템플릿을 최신 AWS 기능 및 Terraform 버전으로 업데이트합니다. 정기 업데이트는 새로운 기능을 활용하고 보안을 유지하는 데 도움이 됩니다.

  • 버전 관리 - AFT 모듈 버전을 고정하고 가능하면 테스트를 위해 별도의 AFT 배포를 사용합니다.

  • 범위 - 인프라 가드레일 및 사용자 지정을 배포할 때만 AFT를 사용합니다. 애플리케이션을 배포하는 데 사용하지 마세요.

  • 린팅 및 검증 - AFT 파이프라인에는 린트되고 검증된 Terraform 구성이 필요합니다. 구성을 AFT 리포지토리로 푸시하기 전에 lint, validate 및 test를 실행합니다.

  • Terraform 모듈 - 재사용 가능한 Terraform 코드를 모듈로 빌드하고 조직의 요구 사항에 맞게 항상 Terraform 및 AWS 공급자 버전을 지정합니다.

에픽

작업설명필요한 기술

배포 AWS Control Tower.

AWS 환경에 AWS Control Tower 를 설정하고 구성하여의 중앙 집중식 관리 및 거버넌스를 보장합니다 AWS 계정. 자세한 내용은 AWS Control Tower 설명서의 시작하기 AWS Control Tower를 참조하세요.

클라우드 관리자

AWS Control Tower Account Factory for Terraform(AFT)을 배포합니다.

새로운 전용 AFT 관리 계정에서 AFT를 설정합니다. 자세한 내용은 AWS Control Tower 설명서의 Configure 및 AWS Control Tower Account Factory for Terraform을 참조하세요.

클라우드 관리자

배포 후 AFT를 완료합니다.

AFT 인프라 배포가 완료되면 AWS Control Tower 설명서의 배포 후 단계의 단계를 완료합니다.

클라우드 관리자
작업설명필요한 기술

IPAM 관리자를 위임합니다.

AWS 조직의 IPAM 관리자 계정을 위임하려면 다음 단계를 사용합니다.

  1. AWS Organizations 관리 계정을 사용하여 https://console.aws.amazon.com/ipam/ IPAM 콘솔을 엽니다.

  2. 에서 IPAM으로 작업할 AWS 리전 를 AWS Management 콘솔선택합니다.

  3. 탐색 창에서 조직 설정을 선택합니다.

  4. 위임을 선택합니다. 위임 옵션은 콘솔에 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 VPC 설명서의 IPAM을 AWS 조직의 계정과 통합 및 AWS CLI 명령 참조의 enable-ipam-organization-admin-account를 참조하세요.

중요

IPAM을 계속 사용하려면 위임된 관리자 계정에 로그인해야 합니다. 다음 단계에서 지정된 SSO 프로파일 또는 AWS 환경 변수를 사용하여 해당 계정에 로그인하고 IPAM 최상위 및 리전 풀을 생성할 수 있는 권한을 부여할 수 있어야 합니다.

관리자

IPAM 최상위 및 리전 풀을 생성합니다.

이 패턴의 GitHub 리포지토리에는 IPAM 최상위 풀 및 리전 풀을 생성하는 데 사용할 수 있는 Terraform 템플릿이 포함되어 있습니다. 그런 다음 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 Management 콘솔.

중요

생성된 풀의 CIDRs이 작업 리전의 다른 풀과 겹치지 않도록 해야 합니다. CIDR 없이도 풀을 생성할 수 있지만 CIDR을 프로비저닝하기 전까지는 할당에 대해 풀을 사용할 수 없습니다. 풀을 편집하여 언제든지 풀에 CIDR을 추가할 수 있습니다.

관리자
작업설명필요한 기술

계정 사용자 지정 생성을 시작합니다.

새 계정 사용자 지정을 시작하려면 터미널에서 다음 명령을 실행합니다.

# 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 파일에 추가합니다.

다음 단계를 사용합니다.

  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 파일을 생성합니다.

사용할 Terraform 백엔드 및 공급자를 지정하는 동적 코드를 backend.jinja 파일에 추가합니다.

다음 단계를 사용합니다.

  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 파일을 생성합니다.

CodeBuild에서 일부 값을 노출하는 새 outputs.tf 파일을 생성합니다.

다음 단계를 사용합니다.

  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 파일에 코드를 추가합니다. 사용자 지정 필드는 올바른 IPAM 할당 IPv4 CIDR을 사용하여 VPC를 생성하는 데 필요한 Systems Manager 파라미터를 판매 계정에 생성합니다.

다음 단계를 사용합니다.

  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고 IPs 풀에서 VPC에 할당할 수 있는 충분한 IP가 있는지 확인합니다.

  3. 새 계정을 계정 요청 리포지토리에 커밋하려면 다음 명령을 사용합니다.

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

사용자 지정을 검증합니다.

새로 판매된 계정에 로그인하고 사용자 지정이 성공적으로 적용되었는지 확인합니다.

다음 단계를 사용합니다.

  1. AWS IAM Identity Center 로그인 페이지를 열고 account-requests.tf 파일에 지정한 사용자로 인증합니다.

  2. IAM Identity Center 계정 목록에서 이전에 판매한 계정을 선택하고 역할을 사용하여 로그인합니다 AWS AdministratorAccess.

  3. VPC 콘솔로 이동하여 VPCs 선택합니다.

  4. 방금 생성한 VPC의 VPC ID를 선택합니다.

  5. CIDR 탭을 선택합니다. IPAM 할당 IPv4 CIDR이 표시되어야 합니다.

  6. (선택 사항) IPAM 위임된 관리자 계정에 로그인하고 할당이 IPAM 콘솔에 표시되는지 확인합니다.

DevOps 엔지니어

문제 해결

문제Solution

부적절한 권한으로 인해 리소스 생성 또는 관리에 오류가 발생합니다.

Step Functions, CodeBuild 및 배포와 관련된 기타 서비스에 연결된 AWS Identity and Access Management (IAM) 역할 및 정책을 검토합니다. 필요한 권한이 있는지 확인합니다. 권한 문제가 있는 경우 IAM 정책을 조정하여 필요한 액세스 권한을 부여합니다.

배포 중에 할당 AWS 서비스 량에 도달합니다.

파이프라인을 배포하기 전에 Amazon Simple Storage Service(Amazon S3) 버킷, IAM 역할 및 AWS Lambda 함수와 같은 리소스의 할당 AWS 서비스 량을 확인합니다. 필요한 경우 할당량 증가를 요청합니다. 자세한 정보는 AWS 일반 참조AWS 서비스 할당량을 참조하세요.

관련 리소스

AWS 서비스 설명서

기타 리소스