본문 바로가기

AWS

[CI/CD] Github Action + AWS Elastic Beanstalk + ECR + IAM + Docker + ARM + Java or Kotlin + Spring Boot + Gradle 배포 (4)

해당 자료는 총 5개 파트로 나누어서 자료를 정리할 예정이다.

part 1. IAM user 권한 설정

part 2. ECR repo 세팅

part 3. EB 설정 후 샘플 코드 서버 세팅

part 4. Spring Boot 프로젝트 내부 설정

part 5. github action 세팅


Part 4. Spring Boot 프로젝트 내부 설정

part 3을 못 보셨다면 먼저 보시길 바란다.

https://dexlee.tistory.com/171

 

Intro.

EB 커스텀 설정, 도커 이미지 만들기, EB 환경에서 이미지 실행 json파일에 대해서 알아보겠다.

 

1. EB 커스텀 설정

1)  .ebextensions

  • eb 커스터마이징 설정

[1] .ebextensions/00-set-timezone.config

 

commands:
  set_time_zone:
    command: ln -f -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

[2] .ebextensions/alb-http-to-https-redirection-full.config

 

Resources:
  AWSEBV2LoadBalancerListener:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      DefaultActions:
        - Type: redirect
          RedirectConfig:
            Protocol: HTTPS
            Port: '443'
            Host: '#{host}'
            Path: '/#{path}'
            Query: '#{query}'
            StatusCode: HTTP_301
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 80
      Protocol: HTTP
  AWSEBV2LoadBalancerListener443:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Certificates:
        - CertificateArn: https 인증서 arn 넣기
      DefaultActions:
        - Type: forward
          TargetGroupArn:
            Ref: AWSEBV2LoadBalancerTargetGroup
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 443
      Protocol: HTTPS

 

80 포트로 들어와도 443 포트로 연결시켜주는 설정이다.

 

 

2) .platform

 

  • nginx 등 eb 설정이 아닌 설정 파일을 보관하는 디렉토리

 

[1] .platform/nginx/nginx.conf

 

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    33193;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        client_header_timeout 600;
        client_body_timeout   600;
        keepalive_timeout     600;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
        send_timeout 600;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        include conf.d/elasticbeanstalk/*.conf;
    }

    client_max_body_size 1024M;
}

 

2. 도커 이미지 만들기

 

1) Dockerfile

 

# EC2 인스턴스 타입이 ARM이기 때문에 arm64v8/amazoncorretto 사용
FROM arm64v8/amazoncorretto:8u332-al2
# linux update timezone
RUN yum install -y tzdata curl && yum install -y mysql
# timezone settings
RUN cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

ARG JAR_FILE=/build/libs/*.jar

COPY ${JAR_FILE} application.jar

EXPOSE 5000

ENTRYPOINT ["java","-jar", "/application.jar"]

2) Dokerrun.aws.json

 

  • EB에서 ECR에 pull 요청을 해 이미지를 받아오는 실행 파일

 

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "777750262439.dkr.ecr.ap-northeast-2.amazonaws.com/home-main:latest",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": 5000,
      "HostPort": 5000
    }
  ]
}

 

AWSEBDockerrunVersion 는 Dockerrun.aws.json 파일의 버전을 나타낸다.

docker compose 사용하지 않는 다면 v1 사용한다.

 

 

 

references

1) EB에 대한 모든 것.(Dockerrun.aws.json 에 대한 설명도 포함)

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/awseb-dg.pdf

 

2) Dockerrun.aws.json

https://dev.to/aws-builders/aws-elastic-beanstalk-ft-docker-for-deploying-simple-web-app-5co7

 

3) docker 최적화

https://stackoverflow.com/questions/43840365/does-alpine-apk-have-an-ubuntu-apt-no-install-recommends-equivalent

https://yeomko.tistory.com/10

 

4) cmd vs entrypoint in Dockerfile

https://bluese05.tistory.com/77

 

5) base image for arm

https://hub.docker.com/r/arm64v8/amazoncorretto/

 

6) .ebextensions

https://stackoverflow.com/questions/25399685/amazon-elastic-beanstalk-change-timezone

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/awseb-dg.pdf#ebextensions

 

7) eb http to https

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/resource-configuration/alb-http-to-https-redirection-full.config

 

8) .platform, nginx

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/java-se-nginx.html

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html