본문 바로가기

프로젝트 & TIL/일별 공부 기록 (백엔드 스쿨)

89일차 - 테라폼, AWS EC2, IAM Role, 인스턴스 프로파일, S3와 버킷

AWS EC2 생성

# 기존 코드

...

resource "aws_instance" "ec2_1" {
  ami                    = "ami-04b3f91ebd5bc4f6d" # AMI 코드
  instance_type          = "t2.micro"
  subnet_id              = aws_subnet.sub_1.id
  vpc_security_group_ids = [aws_security_group.sg_1.id]

  tags = {
    Name = "${var.prefix}-ec2-1"
  }
}

공인 IP 할당

...

resource "aws_subnet" "sub_1" {
  vpc_id                  = aws_vpc.vpc_1.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "${var.region}a"
  map_public_ip_on_launch = true # 추가

  tags = {
    Name = "${var.prefix}-sub-1"
  }
}

...

resource "aws_instance" "ec2_1" {
  ami                    = "ami-04b3f91ebd5bc4f6d"
  instance_type          = "t2.micro"
  subnet_id              = aws_subnet.sub_1.id
  vpc_security_group_ids = [aws_security_group.sg_1.id]
  associate_public_ip_address = true # 공인 IP 할당

  tags = {
    Name = "${var.prefix}-ec2-1"
  }
}

- 공인 IP 할당 후에 EC2 인스턴스 요약 > 연결 > EC2 인스턴스 연결 - 연결 클릭하여 서버 접속

- 'sudo su' 명령어로 root 유저로 변경 가능


EC2를 위한 IAM Role 생성과 인스턴스 프로파일

# EC2를 위한 IAM Role 생성
resource "aws_iam_role" "ec2_role_1" {
  name = "${var.prefix}-ec2-role-1"

  assume_role_policy = <<EOF
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "sts:AssumeRole",
        "Principal": {
          "Service": "ec2.amazonaws.com"
        },
        "Effect": "Allow",
        "Sid": ""
      }
    ]
  }
  EOF
}

# 권한1
resource "aws_iam_role_policy_attachment" "s3_full_access" {
  role       = aws_iam_role.ec2_role_1.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}

# 권한2
resource "aws_iam_role_policy_attachment" "ec2_ssm" {
  role       = aws_iam_role.ec2_role_1.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
}

# 인스턴스 프로파일
resource "aws_iam_instance_profile" "instance_profile_1" {
  name = "${var.prefix}-instance-profile-1"
  role = aws_iam_role.ec2_role_1.name
}

# EC2 생성
resource "aws_instance" "ec2_1" {
  ami                         = "ami-04b3f91ebd5bc4f6d"
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.sub_1.id
  vpc_security_group_ids      = [aws_security_group.sg_1.id]
  associate_public_ip_address = true
  
  iam_instance_profile = aws_iam_instance_profile.instance_profile_1.name

  tags = {
    Name = "${var.prefix}-ec2-1"
  }
}

- 인스턴스 프로파일을 통해 EC2와 Role이 연결된다.


EC2에서 S3 조작하기

- aws configure가 필요 없다.

- 공인 IP 할당 후에 EC2 인스턴스 요약 > 연결 > Session Manager - 연결 클릭하여 서버 접속

 

bash
sudo su
aws configure list

aws s3 ls
aws s3 mb s3://{bucket-name}
aws s3 rb s3://{bucket-name}

aws configure list => 이미 액세스 키, 시크릿 키가 존재한다.(수명이 짧고, 자동 갱신됨)

aws s3 ls => 오류가 뜨지 않는다.

aws s3 mb s3://{버킷_이름} : 버킷 생성

aws s3 rb s3://{버킷_이름} --force : 버킷 삭제


테라폼으로 버킷 생성하기

resource "aws_s3_bucket" "bucket_yuri_1" {
  bucket = "${var.prefix}-bucket-yuri-1"

  tags = {
    Name = "${var.prefix}-bucket-yuri-1"
  }
}

AWS 콘솔에서 퍼블릭 버킷 생성하고 클라우드 쉘에서 파일 업로드하기

- 버킷 생성 후 아래와 같이 버킷 정책을 수정해준다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{버킷_이름}/*"
        }
    ]
}

 

- 클라우드 쉘에서 아래와 같이 명령어를 입력한다.

wget {이미지_URL} : 이미지 다운로드

mv {이미지_이름} {이미지_이름}.jpg : 다운로드 받은 이미지 파일에 확장자 붙이기

aws s3 cp {이미지_이름} s3://{버킷_이름} : 이미지 업로드

aws s3 ls s3://{버킷_이름} : 버킷 안의 파일 조회

aws s3 rm {이미지_이름} s3://{버킷_이름/이미지_이름} : 파일 삭제