젠킨스에서 AWS CLI를 통해 elastic bean stalk로 ECR 이미지 배포하기(2)

GwanMtCat·2023년 9월 7일
0

Dockerrun.aws.json 생성 및 S3 생성하기

  • 갑자기 S3 생성은 왜 필요한 것일까?

  • Elastic Beanstalk 에서 도커 지원형태의 애플리케이션을 배포하려면 다음과 같은 방법을 사용할 수 있다.

  • 도커 구성 관련

  • 쉽게 말하면 다음의 세 도구를 사용할 수 있다.

    • docker-compose.yml
    • Dockerfile
    • docker-compose.yml
  • 나는 단일 인스턴스 형태의 ECR 프라이빗 리포지터리에서 배포할 것이므로 세번째를 선택했다.

  • Dockerrun.aws.json은 v1,v2,v3으로 구분되며 아래 조건에 따라 사용하는 버전을 선택할 수 있다.

    • Dockerrun.aws.json v1
      • 단일 인스턴스 Docker Amazon Linux 2 플랫폼 + Docker Compose를 사용하지 않는 환경
    • Dockerrun.aws.json v2
      • 멀티컨테이너 Docker Amazon Linux AMI 플랫폼
    • Dockerrun.aws.json v3
      • 단일 인스턴스 Docker Amazon Linux 2 플랫폼 + Docker Compose를 사용하는 환경
  • 나는 최소화 하는 것이 좋아서 1번을 선택했다.

  • 프로젝트에 Dockerrun.aws.json 생성하고 다음과 같은 내용을 추가하였다.

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "*********.dkr.ecr.ap-northeast-2.amazonaws.com/new_name_auction:latest",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": 8080,
      "HostPort": 8080
    }
  ]
}
  • S3 버킷을 생성하고 URI를 보관해두자. 이는 생략하겠다.

Jenkinsfile 에 스크립트 추가하기

    stage('Deploy AWS') {
      steps {
        script {
          env.EB_APPLICATION_NAME = YourApplicationName
          env.BUCKET_NAME = YourS3BucketName
          env.EB_ENV_NAME = "NewNameAuctionBackEnd-env-2"

          sh """whoami"""

          sh """aws s3 cp "./Dockerrun.aws.json" s3://${BUCKET_NAME}/json/${EB_APPLICATION_NAME}-${getGitCommitPretty()}.aws.json \
            --region ap-northeast-2"""

          sh """
            # Execute Beanstalk
            aws elasticbeanstalk create-application-version \\
                --region ap-northeast-2 \\
                --application-name ${EB_APPLICATION_NAME} \\
                --version-label ${getGitCommitPretty()}-${env.BUILD_ID} \\
                --source-bundle S3Bucket="${BUCKET_NAME}",S3Key="json/${EB_APPLICATION_NAME}-${getGitCommitPretty()}.aws.json"
            """

          sh """
          aws elasticbeanstalk update-environment \\
              --environment-name ${EB_ENV_NAME} \\
              --region ap-northeast-2 \\
              --version-label ${getGitCommitPretty()}-${env.BUILD_ID}
             """
        }
      }
    }
  • 다음과 같이 스크립트가 ECR 이미지를 elasticbeanstalk 에 배포하기 위해 꼭 필요하다.

    • 프로젝트의 Dockerrun.aws.json 파일을 S3에 복사한다.
    • aws elasticbeanstalk cli (혹은 EB Cli) 를 통해 애플리케이션 버전을 생성한다.
      • 이때 source-bundle 옵션으로 가리키는 S3 객체가 바로 위에서 복사하였던 파일이다.
    • aws elasticbeanstalk cli로 환경을 업데이트 한다.
  • 이렇게 하면 elasticbeanstalk 에 배포가 정상적으로 동작한다.

  • 나는 작업하면서 도대체 왜 S3에 올려야 하는지 ECR을 직접 지정하는 방법이 없는지 궁금해서 옵션을 살펴보니...

  • AWS CodeCommit, S3, AWS CodeBuild 를 통해 산출물 지정이 가능한 제한이 있었다. 만약 ECR이 아니라 처음부터 S3에 직접 배포했다면 아마 이렇게 돌아올 이유가 없었을 것이다.. (이 시점에 정말 충격을 받았다.)

  • AWS ElasticBeanstalk 환경 이벤트에 다시 가보면 update가 시작되면서 배포가 완료된다.

배포에 실패한 경우

  • 만약 배포에 실패했다면 환경 이벤트에서 위의 메시지를 볼 수 있다.

  • 로그 탭에 로그요청에 가서 마지막 100줄을 출력하고 분석해 보자.

  • 나의 경우, ECR 프라이빗 리포지터리를 읽는 역할을 추가해주지 않았으므로 이것이 발생하였다.

  • IAM 역할에 AmazonEC2ContainerRegistryReadOnly 를 추가해주면 된다.

0개의 댓글