Bastion Host vs AWS SSM 📌
카카오테크 부트캠프에서 프로젝트를 진행하던 중,
Private Subnet에 있는 Nginx 인스턴스에 접근해서 설정해줘야하는 문제가 발생했다.
보통 이런 경우, Bastion Host 방식을 사용하곤 하는데
간편한 대신 public에 불필요한 인스턴스가 하나 필요하고 보안 이슈가 있다는 단점이 있다.
따라서, AWS SSM 방식으로 진행하였다.
SSM 구성 방법 📌
- IAM Role 생성
- 정책: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
- EC2 인스턴스에 역할 할당
- VPC Endpoint 생성(옵션)
- 인스턴스 - 연결 버튼을 통해 EC2 Console에 접속
Terraform 코드
# IAM Role for SSM
resource "aws_iam_role" "ssm_role" {
name = "dododocs-ssm-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
Action = "sts:AssumeRole"
},
]
})
}
resource "aws_iam_policy_attachment" "ssm_policy_attachment" {
name = "ssm-policy-attachment"
roles = [aws_iam_role.ssm_role.name]
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
resource "aws_iam_instance_profile" "ssm_instance_profile" {
name = "dododocs-ssm-instance-profile"
role = aws_iam_role.ssm_role.name
}
resource "aws_instance" "nginx_instance" {
ami = "ami-0de20b1c8590e09c5"
instance_type = "t2.micro"
subnet_id = aws_subnet.private_a.id
key_name = "dododocs-key"
vpc_security_group_ids = [aws_security_group.nginx_sg.id]
associate_public_ip_address = false
iam_instance_profile = aws_iam_instance_profile.ssm_instance_profile.name
depends_on = [aws_security_group.nginx_sg]
tags = {
Name = "dododocs-nginx-instance"
}
}
VPC Endpoint
- AWS 서비스와 인터넷을 경유하지 않고 안전하게 통신하기 위해 VPC내에서 생성되는 네트워크 구성 요소
- VPC 내부의 리소스가 인터넷 게이트웨이, NAT 게이트웨이, 또는 퍼블릭 IP 없이도 AWS 서비스에 접근할 수 있도록 설정
참조
https://sharplee7.tistory.com/157
https://medium.com/@nagarjun_nagesh/terraform-private-ec2-instance-with-ssm-access-fa7f074965e3
'Cloud > AWS' 카테고리의 다른 글
[AWS/EKS] 다른 Namespace의 LB 사용하는 방법 (0) | 2024.12.02 |
---|---|
[AWS] EKS 구성법 (0) | 2024.11.19 |