본문 바로가기
카테고리 없음

[AWS] AWS LIGHTSAIL & Github Actions 배포

by 용용이아바이 2024. 12. 30.
728x90

Amazon Lightsail 생성

1. Amazon Lightsail 로 이동 후 create instance 클릭

2. Linux/Unix 선택, Operationing System (OS) only 선택, Amazon Linux 2023 선택

3. Dual-stack 선택, 90일 무료 $12 사이즈 선택

4. Lightsail instance 이름 입력, Create instance 클릭

5.  Amazon_Linux_2023-1 이라는 인스턴스 생성됨

IAM 정책, 사용자 생성

1. IAM 으로 이동

2. 사용자로 이동

3. 사용자 생성 클릭

4. 사용자 이름 입력 후 다음 클릭

5. 직접 정책 연결 선택

6. AWSCodeDeployFullAccess 검색 & 선택 다음 클릭

7. 사용자 생성 클릭

8. 생성한 test-user 클릭

9. 권한 추가 클릭, 인라인 정책 생성 클릭

10. lightsail 검색 후 선택

11. 읽기 선택, GetInstancePortStates를 선택

12. 쓰기 선택, CloseInstancePublicPorts, OpenInstancePublicPorts를 선택

 

13. 리소스는 모두를 선택, 다음을 클릭

14. 정책 이름 입력 후 다음 클릭

액세스 키 생성

1.  사용자에서 생성한 유저 클릭

2. 보안 자격 증명 선택 후 액세스 키 만들기 클릭

3. 기타 선택 후 다음 클릭

4. 태그 값 입력 후 액세스 키 만들기 클릭

5. 액세스 키 다운로드 후 완료 클릭

workflow 

YML 작성

1. 프로젝트의 root에서 .github / workflows / deploy.yml 을 생성

name: CI

on:
  push:
    branches: [main]

  workflow_dispatch:
# 환경변수
env:
  # aws region
  AWS_REGION: ap-northeast-2
  # 인스턴스 이름
  INSTANCE_NAME: Amazon_Linux_2023-1
jobs:
  build:
    # ubuntu-latest 환경에서 실행
    runs-on: ubuntu-latest
    # 작업 순서
    steps:
      # 레포지토리 체크아웃
      - name: checkout release
        uses: actions/checkout@v3
      # AWS 인증
      - name: AWS 인증하기
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_REGION }}
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
      # AWS Lightsail에 연결되었는지 확인
      - name: AWS Lightsail에 연결되었는지 확인
        run: aws configure list

      # 공인 IP 가져오기
      - name: Get Public IP
        id: ip
        uses: haythem/public-ip@v1.3
      # 공인 IP 출력
      - name: Print Public IP
        run: |
          echo "Current public IP: ${{ steps.ip.outputs.ipv4 }}"
      # Lightsail에 공인 IP 추가
      - name: Add public IP to Lightsail
        run: |
            NEW_IP="${{ steps.ip.outputs.ipv4 }}/32"
            echo "Adding public IP: $NEW_IP"
            aws lightsail open-instance-public-ports \
              --instance-name ${{ env.INSTANCE_NAME }} \
              --region ${{ env.AWS_REGION }} \
              --port-info protocol=tcp,fromPort=22,toPort=22,cidrs="[$NEW_IP]"
      # SSH로 서버에 접속하여 배포 스크립트 실행
      - name: Run Deployment Script
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          port: 22
          password: ${{ secrets.SERVER_PASSWORD }}
          script: |
              mkdir -p /home/ec2-user/hello
      # 현재 CIDR 가져오고 사용하지 않는 CIDR 제거
      - name: Get current CIDRs for port 22 and remove them
        id: get_cidrs
        run: |
          EXISTING_RULES=$(aws lightsail get-instance-port-states \
            --instance-name ${{ env.INSTANCE_NAME }} \
            --region ${{ env.AWS_REGION }} | jq -r '.portStates[] | select(.protocol=="tcp" and .fromPort==22) | .cidrs[]')

          # 중복 및 잘못된 형식 처리
          CLEANED_RULES=$(echo "$EXISTING_RULES" | sort -u | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(/[0-9]+)?$')
          echo "CLEANED_RULES=$CLEANED_RULES"

          # 각 CIDR 처리
          echo "$CLEANED_RULES" | while read RULE; do
            if [ -n "$RULE" ] && [ "$RULE" != "123.123.123.123/32" ]; then
              echo "Removing $RULE from allowed CIDRs..."
              aws lightsail close-instance-public-ports \
                --instance-name ${{ env.INSTANCE_NAME }} \
                --region ${{ env.AWS_REGION }} \
                --port-info protocol=tcp,fromPort=22,toPort=22,cidrs=${RULE}
            else
              echo "Skipping $RULE..."
            fi
          done

secret 설정

1. github에서 settings > Secrets and variables > Actions를 클릭

2. New repository secret을 선택해서 변수를 추가

테스트

 

728x90