인프라 구축기
인프라 구축기 (3)까지 진행하면서 Terraform을 활용해 인프라 구성을 완료하였다. 이번엔 VPC 내부의 연결이 제대로 이루어졌는지 확인해보려고 한다. 특히 보안 그룹이 제대로 설정돼있지 않으면 접근이 불가능하다. 인프라 구축기 (4)에서는 Bastion Host를 통해 Redshift, RDS, Airflow (ec2)에 접근이 가능한지 확인해보려고 한다.
- 아래의 인프라 아키텍처에서 노란색 선으로 표시된 부분을 확인할 예정
- DB (RDS, Redshift Serverless) : DBeaver를 활용하여 접속 및 쿼리 실행 테스트 진행
- EC2 (Airflow) : Bastion Host에서 다시 한번 ssh 명령어 접속을 통한 테스트
보안 그룹 수정 사항
변경 사항
- ssh_acces_sg를 bastion_host_ssh_access_sg로 변경
- Redshift Serverless, RDS, Airflow (ec2)에 접근하기 위해 각 인스턴스의 보안 그룹에 연결
- Airflow도 ssh port를 추가해줘야 하지만, 용도 별로 나누는 것이 좋을 것 같아 분리
- Redshift Serverless, RDS, Airflow (ec2)의 인바운드 규칙 변경
- 원래는 cidr_blocks로 IP 대역으로 설정
- 접근이 필요한 인스턴스의 보안 그룹 (특히 Bastion Host)을 source_security_group_id로 설정
- 특정 서비스의 접근으로 제한함으로써 보안 강화
추가 사항
- airflow_ssh_access_sg 추가
- 변경 사항에 적었던 것처럼 같은 ssh port를 추가한 것이지만, 용도에 따라 분리
변경된 전체 코드 (security_group.tf)
- security_group.tf의 변경에 따라 main.tf와 instance/variables.tf의 변수 명을 변경
# security group : ssh access for bastion host
resource "aws_security_group" "bastion_host_ssh_access_sg" {
name = "popboard-bastion-host-ssh-access-sg"
description = "Security Group For SSH Access"
vpc_id = aws_vpc.popboard.id
tags = {
Name = "popboard-bastion-host-ssh-access-sg"
}
}
resource "aws_security_group_rule" "basion_host_ssh_access_ipv4" {
type = "ingress"
security_group_id = aws_security_group.bastion_host_ssh_access_sg.id
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = [
# 허용 IP 설정
]
}
# security group : ssh access
resource "aws_security_group" "airflow_ssh_access_sg" {
name = "popboard-airflow-ssh-access-sg"
description = "Security Group For SSH Access"
vpc_id = aws_vpc.popboard.id
tags = {
Name = "popboard-ssh-access-sg"
}
}
resource "aws_security_group_rule" "airflow_ssh_access_from_bastion_host" {
type = "ingress"
security_group_id = aws_security_group.airflow_ssh_access_sg.id
from_port = 22
to_port = 22
protocol = "tcp"
source_security_group_id = aws_security_group.bastion_host_ssh_access_sg.id
}
# security group : all outbound traffic
resource "aws_security_group" "all_outbound_traffic_sg" {
name = "popboard-all-outbound-traffic-sg"
description = "Security Group For Outbound"
vpc_id = aws_vpc.popboard.id
tags = {
Name = "popboard-all-outbound-traffic-sg"
}
}
resource "aws_vpc_security_group_egress_rule" "all_outbound_traffic_ipv4" {
security_group_id = aws_security_group.all_outbound_traffic_sg.id
cidr_ipv4 = "0.0.0.0/0"
ip_protocol = "-1"
}
# security group : airflow web access
resource "aws_security_group" "airflow_web_access_sg" {
name = "popboard-airflow-web-access-sg"
description = "Security Group For Bastion Host"
vpc_id = aws_vpc.popboard.id
tags = {
Name = "popboard-airflow-web-access-sg"
}
}
resource "aws_security_group_rule" "airflow_web_access_ipv4" {
type = "ingress"
security_group_id = aws_security_group.airflow_web_access_sg.id
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = [
# 허용 IP 설정
]
}
# security group : redshift access
resource "aws_security_group" "redshift_access_sg" {
name = "popboard-redshift-access-sg"
description = "Security Group For Redshift"
vpc_id = aws_vpc.popboard.id
tags = {
Name = "popboard-redshift-access-sg"
}
}
resource "aws_security_group_rule" "redshift_access_from_bastion_host" {
type = "ingress"
security_group_id = aws_security_group.redshift_access_sg.id
from_port = 5439
to_port = 5439
protocol = "tcp"
source_security_group_id = aws_security_group.bastion_host_ssh_access_sg.id
}
resource "aws_security_group_rule" "redshift_access_from_airflow" {
type = "ingress"
security_group_id = aws_security_group.redshift_access_sg.id
from_port = 5439
to_port = 5439
protocol = "tcp"
source_security_group_id = aws_security_group.airflow_ssh_access_sg.id
}
# security group : airflow meta db access
resource "aws_security_group" "airflow_meta_db_access_sg" {
name = "popboard-airflow-meta-db-access-sg"
description = "Security Group For Redshift"
vpc_id = aws_vpc.popboard.id
tags = {
Name = "popboard-airflow-meta-db-access-sg"
}
}
resource "aws_security_group_rule" "airflow_meta_db_access_from_bastion_host" {
type = "ingress"
security_group_id = aws_security_group.airflow_meta_db_access_sg.id
from_port = 5432
to_port = 5432
protocol = "tcp"
source_security_group_id = aws_security_group.bastion_host_ssh_access_sg.id
}
resource "aws_security_group_rule" "airflow_meta_db_access_from_airflow" {
type = "ingress"
security_group_id = aws_security_group.airflow_meta_db_access_sg.id
from_port = 5432
to_port = 5432
protocol = "tcp"
source_security_group_id = aws_security_group.airflow_ssh_access_sg.id
}
Bastion Host 접속 : Powershell
ubuntu ec2 (Bastion Host) 접속 명령어
- ssh 명령을 활용해 Bastion Host에 접속
ssh -i bastion_host_key_pair.pem ubuntu@<public_ip>
접속 확인
- 보안 이슈가 발생한다면 "chmod 400 key_pair.pem" 명령어로 권한 변경 후 접속
Bastion Host -> Redshift Serverless : DBeaver
Bastion Host 터널링을 위한 ssh 정보 입력
- Bastion Host의 public ip 및 user name, key pair 등록
- 아래의 Test Connection을 통해 Bastion Host 접근이 가능한지 확인 가능
Redshift Serverless 접근을 위한 정보 입력
- Redshift Serverless의 앤드 포인트, Database 이름, 계정 정보 입력
- AWS 웹 상에서 앤드 포인트를 복사하면, 뒤의 Database 이름과 port 번호가 함께 있으므로 지워줘야 함
접속 확인
Bastion Host -> RDS : DBeaver
RDS 접근을 위한 정보 입력
- Bastion Host의 SSH 정보도 작성해야 함 (Redshift Serverless와 같으므로 생략)
접속 확인
Bastion Host -> Airflow (ec2) : Powershell
Bastion Host에 Airflow Key Pair 업로드
- Airflow 접근을 위해 등록했던 key pair가 추가로 필요
- 로컬 저장소에 있는 airflow_key_pair를 Bastion Host로 업로드하기 위해 scp 명령어 사용
scp -i bastion_host_key_pair.pem airflow_key_pair.pem ubuntu@<public_ip>:/home/ubuntu
Airflow 접속 명령어
- ssh 명령어로 이미 Bastion Host에 위치한 상태에서 명령어를 입력해야 함
ssh -i popboard-airflow-keypair.pem ubuntu@<private ip>
접속 확인
'Infra > [인프라 구축기] Terraform 활용 AWS 인프라 구축' 카테고리의 다른 글
인프라 구축기 (6) - 로컬에서 Private EC2 Airflow Web Server 접속 (0) | 2024.10.17 |
---|---|
인프라 구축기 (5) - Private Subnet EC2에서 다른 Subnet의 인스턴스 접근 확인 (0) | 2024.10.11 |
인프라 구축기 (3) - Terraform을 활용한 Instance, Storage 구성 (0) | 2024.10.06 |
인프라 구축기 (2) - Terraform을 활용한 VPC 구성 (0) | 2024.10.06 |
인프라 구축기 (1) - 개요, IAM 설정, 아키텍처 소개 (1) | 2024.10.02 |