TIL 2024-01-15

장규빈·2024년 1월 15일

TIL

목록 보기
59/59

AWS 설정

  1. IAM 권한 만들기
  • S3 Access Policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
  • ECR Access Policy(region, aws_id, img_name은 각자에 맞게 변경)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GrantSingleImageReadOnlyAccess",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:${region}:${aws_id}:repository/${img_name}"
        },
        {
            "Sid": "GrantECRAuthAccess",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}
  • CodeDeploy Auto Scaling Policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "ec2:CreateTags",
                "ec2:RunInstances"
            ],
            "Resource": "*"
        }
    ]
}
  1. IAM Role 만들기
  • Auto Scaling Role
  • CodeDeploy Auto Scaling Role
  1. EC2 생성
    • ec2 내에 codedeploy-agent 설치
    • 서버 세팅
    • 이미지 만들기(작업 → 이미지 및 템플릿 → 이미지 생성)
  2. 시작템플릿 생성
    • ec2 → 시작 템플릿 → 시작 템플릿 생성
    • 내 AMI중 방금 생성한 이미지 선택
    • 가용영역과 요금에 맞는 인스턴스 유형 선택 (현재 t3.micro)
    • 네트워크 설정은 기존 보안그룹 선택(현재 ec2 보안그룹 →80,8080,22,443)
    • 고급 세부정보에 IAM 인스턴스 프로파일을 선택(방금 만든 Auto Scaling Role)
  3. 대상그룹 선택
    • 대상유형은 인스턴스로 진행
    • HTTP 프로토콜에 8080 포트 입력
    • 현재 사용되는 인스턴스가 있는 vpc 선택
    • 상태검사***
      • 프로토콜 → HTTP
      • 상태 검사 경로 → /actuator/health
      • 성공코드 → 200
    • 고급 상태 검사 설정
      • 간격과 정상 임계 값을 크게 잡으면 Blue Green 배포시 시간을 많이 소모
  4. 로드 벨런서 생성
    • 외부로 노출되기 위해 인터넷 경계 선택
    • 네트워크 매핑시 사용할 영역 모두 선택(2a,2b,2c,2d )
    • 리스너 및 라우팅
      • http → 80 → 그룹선택
      • 리스너 추가
      • https → 443 → 그룹선택
    • 보안 정책 선택
      • 미리 만들어 놓은 ACM 인증서 선택
  5. Auto Scaling 그룹 생성
    • 시작 템플릿 설정
    • VPC 설정(2a,2b,2c,2d )
    • 기존 로드 벨런서에 연결 → 대상그룹 선택
    • Auto Scaling Group 정책 선택 원하는 용량, 최소용량,최대 용량(1,1,3)
  6. CodeDeploy 생성
    • 컴퓨팅 플렛폼 → ec2
  7. 배포그룹 생성
    • 역활 → CodeDeploy Auto Scaling Role
    • 배포유형 → blue/green
    • 환경 구성 → Amazon EC2 Atuo Scalling 그룹 자동 복사 → 생성한 그룹 선택
    • 배포그룹의 원본 인스턴스 종료 (현재 5분)
    • 배포구성 → CodeDeployDefault.AllAtOnce
    • 로드 벨런서 → 생성된 대상그룹 선택
  8. ECR 생성
    • 퍼블릭 레포지토리 생성

CICD 설정

  1. Dockerfile 작성
# Dockerfile

# jdk17 Image Start
FROM openjdk:17 AS builder

# 인자 설정 - JAR_File
ARG JAR_FILE=build/libs/*.jar

# jar 파일 복제
COPY ${JAR_FILE} app.jar

# 인자 설정 부분과 jar 파일 복제 부분 합쳐서 진행해도 무방
#COPY build/libs/*.jar app.jar
# 실행 명령어
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod",  "app.jar"]
  1. appspec.yml 생성
version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/gream
    overwrite: yes
file_exists_behavior: OVERWRITE

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu
    mode: 755

hooks:
  AfterInstall:
    - location: scripts/deploy.sh
      timeout: 200
  1. Github Actions 파일 작성
name: CI

on:
  pull_request:
    branches: [ "main" ]

env:
  PROJECT_NAME: gream
  BUCKET_NAME: bc1-gream-s3-01
  CODE_DEPLOY_APP_NAME: gream
  DEPLOYMENT_GROUP_NAME: gream-developer

jobs:
  test:
    runs-on: ubuntu-latest
    permissions: write-all
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Cache Gradle packages
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Test with Gradle
        run: ./gradlew --info test

      - name: Publish unit test results
        uses: EnricoMi/publish-unit-test-result-action@v2
        if: ${{ always() }}
        with:
          files: build/test-results/**/*.xml

      - name: Cleanup Gradle Cache
        if: ${{ always() }}
        run: |
          rm -f ~/.gradle/caches/modules-2/modules-2.lock
          rm -f ~/.gradle/caches/modules-2/gc.properties
name: CD

on:
  push:
    branches: [ "main" ]

env:
  PROJECT_NAME: gream-v2
  BUCKET_NAME: bc1-gream-s3-01
  CODE_DEPLOY_APP_NAME: gream-v2
  DEPLOYMENT_GROUP_NAME: gream-developer-v2

jobs:
  build-docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: make application-prod.yml
        if: contains(github.ref, 'develop') || contains(github.ref, 'main')
        run: |
          touch ./src/main/resources/application-prod.yml
          echo "${{ secrets.YML_PROD }}" > ./src/main/resources/application-prod.yml
        shell: bash

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        env:
          SPRING_PROFILES_ACTIVE: prod
        run: ./gradlew clean build --stacktrace
        shell: bash

      - name: aws configure
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
          aws-region: ap-northeast-2

      - name: Login to ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: build docker file and setting deploy files
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: gream
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          mkdir scripts
          touch scripts/deploy.sh
          echo "aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin $ECR_REGISTRY" >> scripts/deploy.sh
          echo "docker pull $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> scripts/deploy.sh
          echo "docker run -p 8080:8080 -e JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} -e REDIS_URL=${{ secrets.REDIS_URL }} -e DB_ID=${{ secrets.DB_ID }} -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} -e DB_URL=${{ secrets.DB_URL }} -e PROFILE=prod -d --restart always --name csbroker-api $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> scripts/deploy.sh

      - name: upload to s3
        env:
          IMAGE_TAG: ${{ github.sha }}
        run: |
          zip -r $IMAGE_TAG.zip ./scripts appspec.yml
          aws s3 cp --region ap-northeast-2 --acl private ./$IMAGE_TAG.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

      - name: start deploy
        env:
          IMAGE_TAG: ${{ github.sha }}
        run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-group-name $DEPLOYMENT_GROUP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$IMAGE_TAG.zi

문제

배포 중 AllowTraffic단계에서 무한 로딩후 실패

해결방안

  1. 타겟 그룹에서 ec2의 상태 체크가 unhealthy 상태
  2. ec2 도커 로그 확인
  3. 환경변수값이 제대로 안들어가서 도커가 무한 재실행 상태
  4. 도커 파일 수정
  5. 코드 디플로이 파일 수정
  6. 타겟 그룹에서 ec2의 상태 체크 확인
  7. 재대로 연결 실행

문제

ECR에 파일이 올라가지 않음

해결방안

ECR 재생성후 실행

profile
나다운사람

0개의 댓글