AWS

AWS DirectConnect와 Transit G/W 연결해서 내부 통신 IaC

devfinger 2024. 10. 22. 21:20

AWS Direct Connect와 Transit Gateway를 연결하여 On-Premise 장비에서 AWS 내의 Lambda를 호출할 수 있도록 하는 구조를 Terraform 코드

1) IP 주소로 Lambda 호출

2) DNS 이름으로 Lambda 호출

 

설계 개요

  1. Direct Connect: AWS와 On-Premise 간에 전용 네트워크 연결을 설정
  2. Transit Gateway: Direct Connect와 VPC 간의 라우팅을 관리
  3. Lambda: 호출 대상이 되는 Lambda 함수는 VPC 내에 배포되며, VPC를 통해 On-Premise에서 접근 가능
  4. Private Subnet: Lambda는 Private Subnet에 배치되어 외부 인터넷 없이 내부 네트워크에서 접근
  5. DNS 설정 (옵션): Lambda 함수를 DNS 이름으로 호출할 수 있도록 설정

주요 리소스

  1. Direct Connect 관련 리소스 (aws_dx_gateway, aws_dx_gateway_association)
  2. Transit Gateway 관련 리소스 (aws_ec2_transit_gateway, aws_ec2_transit_gateway_vpc_attachment)
  3. Private Subnet 설정
  4. Lambda 호출을 위한 Security Group 설정
  5. DNS 설정 (옵션)
  6. VPC와 Subnet에 대한 라우팅 설정
# AWS Provider 설정
provider "aws" {
  region = "us-west-2"  # 사용할 리전
}

# 1. VPC 생성
resource "aws_vpc" "main_vpc" {
  cidr_block = "10.0.0.0/16"
  
  tags = {
    Name = "MainVPC"
  }
}

# 2. Private Subnet 생성 (Lambda가 위치할 곳)
resource "aws_subnet" "private_subnet" {
  vpc_id                  = aws_vpc.main_vpc.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = false

  tags = {
    Name = "PrivateSubnet"
  }
}

# 3. Transit Gateway 생성
resource "aws_ec2_transit_gateway" "tgw" {
  description = "My Transit Gateway"
  
  tags = {
    Name = "TransitGateway"
  }
}

# 4. Direct Connect Gateway 생성
resource "aws_dx_gateway" "dx_gw" {
  name            = "DirectConnectGateway"
  amazon_side_asn = 64512  # ASN for AWS side
}

# 5. Direct Connect Gateway를 Transit Gateway에 연결
resource "aws_dx_gateway_association" "dx_tgw_association" {
  dx_gateway_id          = aws_dx_gateway.dx_gw.id
  associated_gateway_id  = aws_ec2_transit_gateway.tgw.id
  associated_gateway_type = "transitGateway"
  
  allowed_prefixes = ["10.0.0.0/16"]  # On-premise에서 접근 가능한 AWS VPC 대역
}

# 6. Transit Gateway와 VPC 연결 (Private Subnet 포함)
resource "aws_ec2_transit_gateway_vpc_attachment" "tgw_attachment" {
  transit_gateway_id = aws_ec2_transit_gateway.tgw.id
  vpc_id             = aws_vpc.main_vpc.id
  subnet_ids         = [aws_subnet.private_subnet.id]

  tags = {
    Name = "TGW_VPC_Attachment"
  }
}

# 7. Lambda 함수 생성 (Private Subnet 내에 배치)
resource "aws_lambda_function" "my_lambda" {
  function_name = "MyPrivateLambda"
  role          = aws_iam_role.lambda_exec_role.arn
  handler       = "index.handler"
  runtime       = "python3.8"
  filename      = "lambda_function.zip"  # 미리 패키징된 Lambda 코드
  
  vpc_config {
    subnet_ids         = [aws_subnet.private_subnet.id]
    security_group_ids = [aws_security_group.lambda_sg.id]
  }

  tags = {
    Name = "MyLambda"
  }
}

# 8. Lambda에 대한 Security Group 생성 (On-Premise에서 Lambda로 연결 허용)
resource "aws_security_group" "lambda_sg" {
  vpc_id = aws_vpc.main_vpc.id

  ingress {
    from_port   = 443  # HTTPS로 Lambda 호출
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["10.0.0.0/16"]  # On-premise에서 오는 트래픽 허용
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"  # 모든 트래픽 허용
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "LambdaSG"
  }
}

# 9. Route Table에 Transit Gateway 추가 (Lambda를 IP로 호출 가능하도록 설정)
resource "aws_route_table" "private_subnet_rt" {
  vpc_id = aws_vpc.main_vpc.id

  route {
    cidr_block                = "10.0.0.0/16"  # On-premise IP 대역
    transit_gateway_id        = aws_ec2_transit_gateway.tgw.id
  }

  tags = {
    Name = "PrivateSubnetRouteTable"
  }
}

# Route Table과 Private Subnet을 연결
resource "aws_route_table_association" "private_subnet_association" {
  subnet_id      = aws_subnet.private_subnet.id
  route_table_id = aws_route_table.private_subnet_rt.id
}

# 10. DNS로 Lambda를 호출할 수 있도록 VPC에 DNS 설정 (옵션)
resource "aws_vpc_dhcp_options" "dns_options" {
  domain_name         = "example.com"  # On-premise DNS 이름
  domain_name_servers = ["AmazonProvidedDNS"]
}

resource "aws_vpc_dhcp_options_association" "dns_options_association" {
  vpc_id          = aws_vpc.main_vpc.id
  dhcp_options_id = aws_vpc_dhcp_options.dns_options.id
}

# 11. IAM Role (Lambda가 실행될 수 있는 권한 제공)
resource "aws_iam_role" "lambda_exec_role" {
  name = "lambda_exec_role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action    = "sts:AssumeRole",
        Effect    = "Allow",
        Principal = {
          Service = "lambda.amazonaws.com"
        }
      }
    ]
  })

  # Lambda가 VPC 내부에서 네트워크 액세스를 허용하는 권한 추가
  inline_policy {
    name = "vpc_access_policy"
    
    policy = jsonencode({
      Version = "2012-10-17",
      Statement = [
        {
          Effect   = "Allow",
          Action   = [
            "ec2:CreateNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DeleteNetworkInterface"
          ],
          Resource = "*"
        }
      ]
    })
  }
}

# 출력: On-premise에서 IP 및 DNS로 Lambda 호출 가능 여부
output "lambda_ip_access" {
  description = "On-Premise에서 IP로 Lambda 호출 가능"
  value       = "Use IP: ${aws_subnet.private_subnet.cidr_block} to access the Lambda function"
}

output "lambda_dns_access" {
  description = "On-Premise에서 DNS로 Lambda 호출 가능"
  value       = "Use DNS: lambda.example.com to access the Lambda function"
}

 

설명

Direct Connect와 Transit Gateway 연결

  • Direct Connect 게이트웨이를 생성하고 Transit Gateway와 연결
  • allowed_prefixes는 On-Premise에서 접근 가능한 VPC IP 대역
  1. VPC, Subnet 및 Route 설정
    • VPC와 Private Subnet을 생성합니다. Lambda는 Private Subnet에서 실행
    • aws_route_table과 aws_route_table_association을 통해 Subnet의 라우팅 테이블에 Transit Gateway 경로를 설정
  2. Lambda 보안 설정
    • Lambda 함수는 Private Subnet에 배포되며, Security Group을 통해 On-Premise에서 Lambda로의 HTTPS 트래픽을 허용
  3. DNS 설정 (옵션)
    • Lambda를 DNS 이름으로 호출할 수 있도록 VPC에 DHCP 옵션을 설정
    • On-Premise에서 DNS 이름(lambda.example.com)으로 Lambda를 호출

결과

  • IP로 Lambda 호출: On-Premise 장비에서 Private Subnet에 배치된 Lambda를 IP로 호출
  • DNS로 Lambda 호출: DNS 옵션을 설정하여 DNS 이름으로 Lambda를 호출

'AWS' 카테고리의 다른 글

AWS Aurora Serverless DB 생성, Lambda로 이벤트 전송 IaC  (0) 2024.10.23
AWS EC2, Lambda, EFS 생성 및 EFS 접근 IaC  (0) 2024.10.23
AWS S3와 CloudFront 연동 IaC  (0) 2024.10.22
AWS EFS 리소스  (1) 2024.10.22
AWS IaC 배포 방법들  (0) 2024.10.22