안녕하세요, 이번 포스팅은 테라폼을 활용한 IPAM 구현에 대해서 포스팅을 올립니다.
Aws workshop ‘Managing Cloud Resources with Terraform ’를 기준으로 내용 정리하였으며, CloudNet@의 테라폼 스터디 내용을 기반하고 있습니다.
본 포스팅을 통해 Aws VPC IP Address Manager (IPAM)을 만들어보도록 하겠습니다.
순서는 다음과 같이,
1. IPAM 배포
2. IPAM Root Pool 배포
3. IPAM Child Pool 배포
4. us-east-1 리전에 VPC 배포
5. us-east-2 리전에 VPC 배포대로 진행합니다.
설명
Amazon VPC IP 주소 관리자(IPAM)는 AWS의 가상 프라이빗 클라우드(VPC) 환경에서 IP 주소를 효율적으로 계획, 추적 및 모니터링할 수 있게 해주는 기능입니다. 이 서비스는 다음과 같은 주요 기능을 제공하여 네트워크 관리를 보다 쉽고 안전하게 할 수 있습니다:
- IP 주소 공간 구성: VPC 내에서 사용할 IP 주소 공간을 라우팅 및 보안 도메인에 맞추어 구성할 수 있습니다.
- IP 주소 공간 모니터링: 사용 중인 IP 주소 공간을 지속적으로 모니터링하고, 비즈니스 규칙에 따라 리소스가 IP 주소를 사용하는 방식을 추적합니다.
- 조직의 IP 주소 할당 관리: 조직 수준에서 IP 주소 할당 내역을 확인하고 관리할 수 있습니다.
- 자동 CIDR 할당: 특정 비즈니스 규칙을 기반으로 VPC에 CIDR을 자동으로 할당하여 네트워크 구성을 자동화할 수 있습니다.
- 네트워크 문제 해결: VPC의 네트워크 연결 문제를 해결하고 최적화할 수 있는 도구를 제공합니다.
- BYOIP(Bring Your Own IP) 주소 관리: 사용자가 소유한 IP 주소를 AWS 인프라에 연결하고, 지역 간 또는 계정 간에 공유할 수 있는 기능을 활성화합니다.
- IPv6 CIDR 블록 프로비저닝: Amazon에서 제공하는 연속적인 IPv6 CIDR 블록을 VPC 생성을 위해 자동으로 프로비저닝 합니다.
이러한 기능들은 AWS의 클라우드 환경에서 IP 주소 관리의 복잡성을 줄이고, 보안성과 효율성을 높이는 데 중요한 역할을 합니다. AWS 사용자는 이러한 IPAM 기능을 통해 네트워크를 관리하고 비즈니스 요구사항에 맞게 최적화된 인프라를 구축할 수 있습니다.
자세한 내용은 다음의 링크를 참조하세요!
IPAM의 작동 방식
IPAM에서 Scope는 IPAM의 최상위 컨테이너입니다.
IPAM에는 기본적으로 두 가지 기본 Scope가 포함되어 있습니다.
각 Scope는 단일 네트워크의 IP 공간을 나타냅니다.
Private Scope는 모든 사설 공간을 위한 것으로, Public Scope는 모든 공용 공간을 위한 것입니다.
Scope를 사용하면 IP 주소의 중복이나 충돌 없이 여러 연결되지 않은 네트워크 간에 IP 주소를 재사용할 수 있습니다. Scope 내에서는 IPAM Pools를 생성할 수 있습니다.
Pool은 연속적인 IP 주소 범위 또는 CIDR의 모음입니다.
IPAM Pool을 사용하면 라우팅 및 보안 요구 사항에 따라 IP 주소를 구성할 수 있습니다.
상위 Pool 내에 여러 개의 Pool을 생성할 수 있습니다. 예를 들어, 개발 및 운영 애플리케이션에 대해 별도의 라우팅 및 보안 요구 사항이 있는 경우 각각의 Pool을 생성할 수 있습니다. IPAM Pool 내에서는 CIDR을 AWS 리소스에 할당할 수 있습니다.
Allocation은 IPAM Pool에서 다른 리소스나 IPAM Pool로의 CIDR 할당입니다.
VPC를 생성하고 VPC의 CIDR로 IPAM Pool을 선택할 때, 해당 CIDR은 IPAM Pool에 프로비저닝 된 CIDR에서 할당됩니다.
Allocation은 IPAM을 통해 모니터링하고 관리할 수 있습니다.
terraform {
required_providers {
awscc = {
source = "hashicorp/awscc"
}
}
}
provider "awscc" {
region = "us-east-1"
}
먼저 위와 같이 provider configuration을 설정합니다.
그런 다음 terraform init을 통해서 초기화를 진행해 줍니다.
진행에 앞서서 awscc provider와 함께 리소스 제어가 가능한지 aws cli를 통해서 확인합니다.
기본적으로 CloudFormation에 게시된 리소스들은 Cloud Control API 리소스 작업이 지원되지만,
프라이빗 리소스 역시 포함되기 때문에 해당 내용을 확인하고 작업할 필요가 있습니다.
이를 확인할 수 있는 방법은 세 가지가 있습니다.
- AWS 명령줄 인터페이스(CLI)
- AWS Cloud Control 문서
- awscc provider 문서
먼저 AWS CLI를 통해서 확인해 봅시다.
aws cloudformation describe-type --type RESOURCE --type-name AWS::EC2::VPC --region us-east-1 | jq '.ProvisioningType'
위 명령을 통해서 "FULLY_MUTABLE"이라 확인되면 리소스 지원된다는 의미이고
aws cloudformation describe-type --type RESOURCE --type-name AWS::AppMesh::Mesh --region us-east-1 | jq '.ProvisioningType'
아래와 같이 "NON_PROVISIONABLE"이라고 확인되면 지원하지 않는다는 의미입니다.
2. AWS Cloud Control 문서
사용할 리소스를 지원하는지 여부를 확인하기 위해서 다음 링크에서도 확인할 수 있습니다.
AWS::EC2::VPC는 지원하는 내용을 확인하실 수 있습니다.
3. awscc provider 문서
해당 내용 2번의 aws 공식 문서와 마찬가지로 링크를 통해서 확인할 수 있습니다.
그럼 이제 리소스 지원 여부를 확인하고
aws cloudformation describe-type --type RESOURCE --type-name AWS::EC2::IPAM --region us-east-1 | jq '.ProvisioningType'
>> 결과 "FULLY_MUTABLE"로 확인됩니다.
main.tf를 만들어서 다음과 같이 저장합니다.
이를 통해서 region us-east-1과 us-east-2에 IPAM 리소스를 만듭니다.
resource "awscc_ec2_ipam" "main" {
operating_regions = [
{
region_name = "us-east-1"
},
{
region_name = "us-east-2"
}
]
tags = [{
key = "Name"
value = "global-ipam"
}]
}
terraform apply를 통해서 리소스를 만들겠습니다.
실행 화면 :
생성된 리소스는 다음의 링크에서 확인합니다.
https://us-east-1.console.aws.amazon.com/ipam/home?region=us-east-1#IPAMs
us-east-1.console.aws.amazon.com
그런 다음, IPAM Pool을 만들기 전에, 리소스 지원을 확인합니다.
aws cloudformation describe-type --type RESOURCE --type-name AWS::EC2::IPAMPool --region us-east-1 | jq '.ProvisioningType'
>> 마찬가지로 지원 가능합니다. "FULLY_MUTABLE"을 확인합니다.
ipam_pool을 다음의 내용으로 작성해 봅시다.
ipv4를 갖는 private_default_scope_id의 리소스를 만듭니다.
resource "awscc_ec2_ipam_pool" "root" {
address_family = "ipv4"
ipam_scope_id = awscc_ec2_ipam.main.private_default_scope_id
auto_import = false
provisioned_cidrs = [
{
cidr = "10.0.0.0/16"
}
]
tags = [{
key = "Name"
value = "top-level-pool"
}]
}
terraform apply를 통해서 리소스를 생성해 주시면 다음과 같이 확인됩니다.
실행 화면 :
IPAM Console에서도 해당 내용 확인하실 수 있습니다.
그렇다면, 기존 코드에서 풀을 추가로 늘려서 적용해 보겠습니다.
위에 작성했던 코드에서 pool 이름 useast1, useast2를 다음과 같이 설정합니다.
resource "awscc_ec2_ipam_pool" "useast1" {
address_family = "ipv4"
auto_import = false
ipam_scope_id = awscc_ec2_ipam.main.private_default_scope_id
locale = "us-east-1"
source_ipam_pool_id = awscc_ec2_ipam_pool.root.ipam_pool_id
provisioned_cidrs = [
{
cidr = "10.0.0.0/17"
}
]
tags = [{
key = "Name"
value = "regional-pool-us-east-1"
}]
}
resource "awscc_ec2_ipam_pool" "useast2" {
address_family = "ipv4"
auto_import = false
ipam_scope_id = awscc_ec2_ipam.main.private_default_scope_id
locale = "us-east-2"
source_ipam_pool_id = awscc_ec2_ipam_pool.root.ipam_pool_id
provisioned_cidrs = [
{
cidr = "10.0.128.0/17"
}
]
tags = [{
key = "Name"
value = "regional-pool-us-east-2"
}]
}
전체 코드는 다음과 같습니다.
resource "awscc_ec2_ipam" "main" {
operating_regions = [
{
region_name = "us-east-1"
},
{
region_name = "us-east-2"
}
]
tags = [{
key = "Name"
value = "global-ipam"
}]
}
resource "awscc_ec2_ipam_pool" "root" {
address_family = "ipv4"
ipam_scope_id = awscc_ec2_ipam.main.private_default_scope_id
auto_import = false
provisioned_cidrs = [
{
cidr = "10.0.0.0/16"
}
]
tags = [{
key = "Name"
value = "top-level-pool"
}]
}
resource "awscc_ec2_ipam_pool" "useast1" {
address_family = "ipv4"
auto_import = false
ipam_scope_id = awscc_ec2_ipam.main.private_default_scope_id
locale = "us-east-1"
source_ipam_pool_id = awscc_ec2_ipam_pool.root.ipam_pool_id
provisioned_cidrs = [
{
cidr = "10.0.0.0/17"
}
]
tags = [{
key = "Name"
value = "regional-pool-us-east-1"
}]
}
resource "awscc_ec2_ipam_pool" "useast2" {
address_family = "ipv4"
auto_import = false
ipam_scope_id = awscc_ec2_ipam.main.private_default_scope_id
locale = "us-east-2"
source_ipam_pool_id = awscc_ec2_ipam_pool.root.ipam_pool_id
provisioned_cidrs = [
{
cidr = "10.0.128.0/17"
}
]
tags = [{
key = "Name"
value = "regional-pool-us-east-2"
}]
}
실행 화면 :
위와 같이 2개의 풀이 추가로 생성된 것을 확인할 수 있습니다!
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] 테라폼 모듈을 활용한 AWS EC2 인스턴스 반복 배포 (2) | 2024.07.14 |
---|---|
[Terraform] 테라폼 모듈을 활용한 athena 데이터 카탈로그 배포 (0) | 2024.07.14 |
[Terraform] 테라폼 코드를 활용한 레드시프트 배포 (0) | 2024.07.07 |
[Terraform] 프로바이더를 활용한 리전별, 멀티 클라우드 리소스 생성 (0) | 2024.07.07 |
[Terraform] 테라폼 내장함수 사용하기 (0) | 2024.06.29 |