인프라/클라우드

AWS EC2, RDS, VPC 및 배포 자동화 구성하기

jwKim96 2022. 6. 20. 05:09

😆😆 넘 기분이 좋다

위 그림과 같은 인프라 구조를 구성하는것이 목표 입니다.

1. VPC 설정

  • 이름 : issue-tracker-vpc
    • IPv4 CIDR : 10.0.0.0/16
    • 태그 : project, issue-tracker

1.1 private subnet 2개 생성

  • 이름 : issue-tracker-private-subnet-1-ap-northeast-2a
    • private subnet 1 : 10.0.0.0/24
    • 가용 영역 : ap-northeast-2a
    • 태그 : project, issue-tracker
  • 이름 : issue-tracker-private-subnet-2-ap-northeast-2b
    • private subnet 1 : 10.0.1.0/24
    • 가용 영역 : ap-northeast-2b
    • 태그 : project, issue-tracker

1.1.1 라우팅 테이블 생성

  • 이름 : issue-tracker-private-rtb-ap-northeast-2
    • VPC(issue-tracker-vpc-ap-northeast-2) 에 연결
    • 태그 : project, issue-tracker

1.2 public subnet 2개 생성

  • 이름 : issue-tracker-public-subnet-1-ap-northeast-2a
    • public subnet 1 : 10.0.10.0/24
    • 가용 영역 : ap-northeast-2a
    • 태그 : project, issue-tracker
  • 이름 : issue-tracker-public-subnet-2-ap-northeast-2b
    • public subnet 1 : 10.0.11.0/24
    • 가용 영역 : ap-northeast-2b
    • 태그 : project, issue-tracker

1.3 IGW 생성

  • 이름 : issue-tracker-igw-ap-northeast-2
    • VPC(issue-tracker-vpc-ap-northeast-2) 에 연결
    • 태그 : project, issue-tracker

1.4 IGW 연결

1.4.1 라우팅 테이블 생성

  • 이름 : issue-tracker-public-rtb-ap-northeast-2
    • VPC(issue-tracker-vpc-ap-northeast-2) 에 연결
    • 태그 : project, issue-tracker
  • 라우팅 편집
    • 0.0.0.0/0 -> issue-tracker-igw-ap-northeast-2
  • 서브넷 연결 편집
    • issue-tracker-pub-subnet-1-ap-northeast-2 연결
    • issue-tracker-pub-subnet-2-ap-northeast-2 연결

2. NAT Instance

2.1. 보안그룹 생성

  • 이름 : issue-tracker-sg-nat
    • 인바운드 규칙
      • 모든 트래픽, issue-tracker-private-subnet-1-ap-northeast-2 의 CIDR
      • 모든 트래픽, issue-tracker-private-subnet-2-ap-northeast-2 의 CIDR

2.2. 인스턴스 생성

  • 이름 : issue-tracker-ec2-nat-ap-northeast-2
    • 태그 : project, issue-tracker
  • OS : Amazon Linux 2 AMI (HVM) - Kernel 5.10
  • 아키텍처 : 64bit
  • 인스턴스 유형 : t2.micro
  • 키페어 생성
    • 이름 : issue-tracker-ec2-key
    • 유형 : RSA
    • 형식 : .pem
  • VPC : issue-tracker-public-subnet-1-ap-northeast-2
    • 퍼블릭 IP 자동 할당 : 활성화
  • 보안그룹 : issue-tracker-sg-nat
  • 스토리지 : 8G
  • 고급 세부 정보
    • 사용자 데이터
#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
/sbin/iptables -t nat -A POSTROUTING -o eth0 -s 0.0.0.0/0 -j MASQUERADE
/sbin/iptables-save > /etc/sysconfig/iptables
mkdir -p /etc/sysctl.d/
cat < /etc/sysctl.d/nat.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.eth0.send_redirects = 0
EOF

2.3 소스 대상 확인 변경 Disable

  1. EC2 인스턴스 리스트에서 NAT(issue-tracker-ec2-nat-ap-northeast-2)선택
  2. 작업 > 네트워킹 > 소스/대상 확인 변경
  3. 중지 선택 후 저장

2.4. NAT 인스턴스 정상 동작 확인

2.4.1 ssh 접속

chmod 400 issue-tracker-ec2-key.pem
ssh -i issue-tracker-ec2-key.pem ec2-user@서버ip

2.4.2 인터넷 접속 테스트

ping ietf.org
PING ietf.org (4.31.198.44) 56(84) bytes of data.
64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=1 ttl=45 time=111 ms
64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=2 ttl=45 time=111 ms

2.5. 라우팅 테이블 설정

VPC - 라우팅테이블 메뉴로 이동

issue-tracker-private-rtb-ap-northeast-2 라우팅 편집

  • 0.0.0.0/0 -> issue-tracker-ec2-nat-ap-northeast-2

3. WAS Instance

3.1. 보안그룹 생성

  • 이름 : issue-tracker-sg-was
    • 규칙 추가 없이 그냥 생성
    • 태그 : project, issue-tracker

3.2. 인스턴스 생성

  • 이름 : issue-tracker-ec2-was-ap-northeast-2
    • 태그 : project, issue-tracker
  • OS : Amazon Linux 2 AMI (HVM) - Kernel 5.10
  • 아키텍처 : 64bit
  • 인스턴스 유형 : t2.micro
  • 기존 키페어 선택
    • issue-tracker-ec2-key
  • VPC : issue-tracker-private-subnet-1-ap-northeast-2
    • 퍼블릭 IP 자동 할당 : 비활성화
  • 보안그룹 : issue-tracker-sg-was
  • 스토리지 : 8G

3.2.1 (선택) 사용자 데이터 추가

#!/bin/sh

# code deploy install
yum install -y ruby
yum install -y wget

CODEDEPLOY_BIN="/opt/codedeploy-agent/bin/codedeploy-agent"
$CODEDEPLOY_BIN stop

yum erase codedeploy-agent -y
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
./install auto
systemctl start codedeploy-agent
systemctl enable codedeploy-agent

# mysql install
yum -y install mysql

# java 11 install
yum install -y java-11-amazon-corretto.x86_64

# nginx install
amazon-linux-extras install -y nginx1

echo "
server {
  listen 80;
  listen [::]:80;
  server_name localhost;
  location /api {
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
  }
}
" > /etc/nginx/conf.d/isuse-tracker.conf

systemctl start nginx
systemctl enable nginx
EOF

3.3 ssh 키 NAT 에 전송 및 접속

mac> ssh-add -K issue-tracker-ec2-key.pem
mac> ssh -A -i issue-tracker-ec2-key.pem ec2-user@NAT퍼블릭IP

3.4 WAS 인스턴스 접속

nat> ssh ec2-user@WAS프라이빗IP

3.5 인터넷 접속 테스트

ping ietf.org
PING ietf.org (4.31.198.44) 56(84) bytes of data.
64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=1 ttl=45 time=111 ms
64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=2 ttl=45 time=111 ms

3.6 필요 소프트웨어 설치

3.6.1 Java 설치

was> sudo yum list | grep jdk
was> sudo yum install java-11-amazon-corretto.x86_64
was> java -version

3.6.2 MySQL 설치

was> sudo yum -y install mysql
was> mysql --version
was> mysql -h SERVER_IP -u USER_ID -p DATABASE_NAME
enter password: PASSWORD

3.6.3 CodeDeploy Agent 설치

was> sudo yum update
was> sudo yum install ruby
was> sudo yum install wget

was> #!/bin/bash
CODEDEPLOY_BIN="/opt/codedeploy-agent/bin/codedeploy-agent"
$CODEDEPLOY_BIN stop
yum erase codedeploy-agent -y

was> cd /home/ec2-

was> wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

was> chmod +x ./install

was> sudo ./install auto

was> sudo service codedeploy-agent start
was> sudo service codedeploy-agent status

4. RDS 설정

4.1 서브넷 그룹 생성

  • 이름 : issue-tracke-rds-subnet-group
    • 서브넷 추가(가용 영역)
      • ap-northeast-2a
      • ap-northeast-2b
    • 태그 : project, issue-tracker

4.2 파라미터 그룹 생성

  • 이름 : issue-tracker-rds-param-group
    • timezone : Asia/Seoul
    • collation_database : utg8mb4
    • default_collation_for_utf8mb4 : utf8mb4_general_ci
    • character_set_database : utf8mb4
  • 태그 : project, issue-tracker

4.3. 데이터데이스 생성

  • Engine : MySQL
  • Version : 8.0.x
  • 템플릿 : 프리티어
  • 이름(식별자) : issue-tracker-rds-ap-northeast-2
  • 태그 : project, issue-tracker
  • 자격 증명 설정
    • user : root
    • password : issue-tracker
  • 연결
    • VPC : issue-tracker-vpc-ap-northeast-2
    • 서브넷 그룹 : issue-tracke-rds-subnet-group
    • 가용 영역 : ap-northeast-2a
  • 추가 구성
    • DB 파라미터 그룹 : issue-tracker-rds-param-group

5. S3 버킷

5.1. Front-end 배포용 버킷

  • 이름 : issue-tracker-s3-frontend-deploy
  • 태그 : project, issue-tracker
  • AWS 리전 : ap-northeast-2a
  • 모든 퍼블릭 엑세스 차단 : 체크 해제
    • 바로 아래 주의사항 체크

5.1.1 권한 설정

버킷 정책 생성기

생성된 정책의 "Resource" 에서 "arn:aws:s3:::jwkim-public-test""arn:aws:s3:::jwkim-public-test/*" 로 변경

5.1.2 정적 리소스 호스팅 설정

속성 탭의 최하단으로 이동

)

)

가린 부분에 엔드포인트가 나옴

참고 : https://kukim.tistory.com/144

5.2. Back-end 배포용 버킷

  • 이름 : issue-tracker-s3-backend-deploy
  • 태그 : project, issue-tracker
  • AWS 리전 : ap-northeast-2a
  • 모든 퍼블릭 엑세스 차단 : 체크

5.3 ALB 설정

5.3.1 타겟 그룹 생성

  • 이름 : issue-tracker-target-group
  • 태그 : project, issue-tracker
  • Target type : Instance
  • Protocol : HTTP, 80
  • VPC : `issue-tracker-vpc

다음(next) 를 누르고

  • issue-tracker-ec2-was-ap-northeast-2 체크 후 Include as Pending below 클릭

5.3.2 ALB 생성

Application Load Balancer 설정

  • 이름 : issue-tracker-alb
  • scheme : internet-facing
  • IP Address type : IPv4
  • VPC : issue-tracker-vpc
  • Mappings
    • ap-northeast-2a
      • issue-tracker-subnet-public1-ap-northeast-2a
    • ap-northeast-2b
      • issue-tracker-subnet-public1-ap-northeast-2b
  • SecurityGroup
    • 생성
      • 이름 : issue-tracker-sg-alb
      • 인바운드 : HTTP, 0.0.0.0/0
  • Listeners and routing
    • HTTP, 80, issue-tracker-target-group

5.3.2 WAS ALB 인바운드 허용

EC2 > 보안그룹 > issue-tracker-sg-was > 인바운드 규칙 편집

  • 규칙 추가 : HTTP, issue-tracker-sg-alb

5.4 CloudWatch log 전송 설정

6. IAM 설정

6.1 Github Action 사용자 생성

사용자 추가

  • 이름 : issue-tracker-iam-github-action
  • 엑세스 유형 : 엑세스 키
  • 권한
    • AmazonS3FullAccess
    • AWSCodeDeployFullAccess
    • CloudFrontFullAccess
  • 태그 : project, issue-tracker

사용자 만들기가 완료되면 꼭!!! .csv 다운로드 하기
(완료 페이지를 나가면 더 이상 엑세스 키 ID, 비밀 엑세스 키 볼 수 없음)

6.2 EC2 가 사용할 역할 생성

6.2.1 정책 생성

정책 json 에 아래와 같이 입력

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "codedeploy-commands-secure:GetDeploymentSpecification",
                "codedeploy-commands-secure:PollHostCommand",
                "codedeploy-commands-secure:PutHostCommandAcknowledgement",
                "codedeploy-commands-secure:PutHostCommandComplete"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
  • 이름 : issue-tracker-iam-policy-codedeploy-agent
  • 태그 : project, issue-tracker

6.2.2 역할 생성

  • 이름 : issue-tracker-iam-role-ec2-deploy-agent
  • 권한
    • AmazonS3FullAccess
    • issue-tracker-iam-policy-codedeploy-agent
  • 태그 : project, issue-tracker

6.3 CodeDeploy 가 사용할 역할 생성

  • 이름 : issue-tracker-iam-role-codedeploy
  • 권한
    • AWSCodeDeployRole
  • 태그 : project, issue-tracker

6.4 CodeDeploy

6.4.1 애플리케이션

  • 이름 : issue-tracker-application
  • 컴퓨팅 플랫폼 : EC2/온프레미스

6.4.2 Back-end 배포 그룹 생성

  • 이름 : issue-tracker-be-dg
  • 태그 : project, issue-tracker
  • 역할 : issue-tracker-iam-role-ec2-deploy-agent
  • 환경 구성 : Amazon EC2 인스턴스
    • 태그 그룹 1
      • 키 : Name, issue-tracker-ec2-was-ap-northeast-2
  • 로드 밸런서 : 체크 해제

7. CloudFront