AWS Direct Connect와 Transit Gateway를 연결하여 On-Premise 장비에서 AWS 내의 Lambda를 호출할 수 있도록 하는 구조를 Terraform 코드
1) IP 주소로 Lambda 호출
2) DNS 이름으로 Lambda 호출
설계 개요
- Direct Connect: AWS와 On-Premise 간에 전용 네트워크 연결을 설정
- Transit Gateway: Direct Connect와 VPC 간의 라우팅을 관리
- Lambda: 호출 대상이 되는 Lambda 함수는 VPC 내에 배포되며, VPC를 통해 On-Premise에서 접근 가능
- Private Subnet: Lambda는 Private Subnet에 배치되어 외부 인터넷 없이 내부 네트워크에서 접근
- DNS 설정 (옵션): Lambda 함수를 DNS 이름으로 호출할 수 있도록 설정
주요 리소스
- Direct Connect 관련 리소스 (aws_dx_gateway, aws_dx_gateway_association)
- Transit Gateway 관련 리소스 (aws_ec2_transit_gateway, aws_ec2_transit_gateway_vpc_attachment)
- Private Subnet 설정
- Lambda 호출을 위한 Security Group 설정
- DNS 설정 (옵션)
- 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 대역
- VPC, Subnet 및 Route 설정
- VPC와 Private Subnet을 생성합니다. Lambda는 Private Subnet에서 실행
- aws_route_table과 aws_route_table_association을 통해 Subnet의 라우팅 테이블에 Transit Gateway 경로를 설정
- Lambda 보안 설정
- Lambda 함수는 Private Subnet에 배포되며, Security Group을 통해 On-Premise에서 Lambda로의 HTTPS 트래픽을 허용
- 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 |