5 min to read
Github Action, Docker 통한 EC2 자동배포(2)- aws ECR 사용하기
전의 블로그를 보면 깃허브의 메인브런치에 푸시될떄 도커허브에 이미지를 push, ec2에 접속해 거기서 pull 받아 실행시켰다. 근데 매니저님께서 도커허브는 public이기 때문에 aws의 ECR에 올리는것이 좋겠다고 말씀해주셨다.
node-alpline
도커 파일 맨 위의 from node부분을 알파인으로 바꾼다. alpline이란 필요한 것만 남겨놓고 남은것. 도커 파일 빌드시간을 줄이고 불필요한것을 사용하지 않는다.
Docker 멀티 스테이지 빌드
Multi Stage는 Docker build의 옵션 기능. Multi Stage는 여러 개의 BaseImage를 사용하여 docker build를 수행. 멀티 스테이지 빌드는 Dockerfile에서 여러 개의 FROM 지시문을 사용하여 여러 단계의 이미지 빌드를 수행하는 기술. 각 단계마다 다른 이미지를 사용하여 필요한 의존성을 포함하고 실행 파일을 빌드하거나 복구한다. 최종 이미지의 크기를 줄이고, 보안을 강화하며, 빌드 프로세스를 최적화.
근데 두번째꺼는 계속 에러나길래 내가 좀더 공부한후에 하기로..ㅎ 사실 계속 2시 넘어서 자니까 머리가 안굴러감 2시에 자서 7에 일어나니까..ㅎ
ECR 배포
- iam 사용자 생성후 권환주기 iam들어가 사용자 추가 후 권한 설정 부분에 직접 정책 연결 클릭. AmazonEC2ContainerRegistryFullAccess
AWSAppRunnerServicePolicyForECRAccess 이거 두개 권한주기 원래 첫번째꺼만 하면 된다고 하는데 아래 ECR이 들어가서 혹시 몰라서 권한 줌.
그 후 사용자 클릭 후 요약에 있는 액세스키 생성 눌러 액세스키 시크릿 키 확인하기. 중요한건 이건 여기서 넘어가면 못보니까 아래 있는 .csv로 다운 눌러 다운받아 사용하기.
- 일단 ec2인스턴스에 awscli설치하기.
sudo apt-get update sudo apt-get upgrade sudo apt-get install awscli
- 그후 aws ec2에서 aws인증을 해줘야 함.
aws configure
입력하면 여기에 iam의 access키 시크릿키 리전 포멧 넣으면 됨. 리전은 서울껄로 했으면 ap-northeast-2 포멧은 json 그후 로그인
aws ecr get-login --no-include-email
이렇게 하면 docker login이라고 하는 엄청 긴 뭐가 나오는데 이걸 복붙해서 터미널에 입력. 만약 안나오면 입력키 시크릿키 잘못된거 한번 더 configure해서 입력. 계속 틀리면 그냥 아예 2개까지는 만들 수 있으니까 하나 더 만들기..
- ECR레포지토리 만들기
ECR들어가 ECR 프라이빗 으로 레포지토리 만들기.
퍼블릭은 깃액션에서 못찾음.
만약 나중에 깃액션을 돌렸는데도 못찾고 EOF인가 자꾸 권한이 없다고 나오면 permissions들어가 정책 json편집 들어가서.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPushPull", "Effect": "Allow", "Principal": "*", "Action": [ "ecr-public:BatchCheckLayerAvailability", "ecr:BatchCheckLayerAvailability", "ecr:BatchGetImage", "ecr:CompleteLayerUpload", "ecr:GetDownloadUrlForLayer", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ] } ] }
입력 나는 프라이빗으로 만드니까 바로 되긴 하더라.
- 깃액션 바꾸기
``` yml
name: Deploy to EC2 with ECR
#ECRd∂S
on:
push:
branches:
- main jobs: deploy: runs-on: ubuntu-latest steps:
- name: Checkout repository uses: actions/checkout@v2
# AWS에 로그인
-
name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v2 with: aws-access-key-id: $ aws-secret-access-key: $ aws-region: $
-
name: Check if S3 credentials are set run: | if [[ -z “$” ]] || [[ -z “$” ]]; then echo “S3 credentials are not set.” exit 1 else echo “S3 credentials are set.” fi
# ECR에 로그인
- name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 with: mask-password: ‘true’
# Docker 이미지 빌드 및 푸시
- name: Build, tag, and push image to Amazon ECR
env:
ECR_REGISTRY: $
ECR_REPOSITORY: trello
IMAGE_TAG: latest
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
–build-arg DATABASE_URL=$
–build-arg PORT=$
–build-arg DATABASE_HOST=$
–build-arg DATABASE_PORT=$
–build-arg DATABASE_NAME=$
–build-arg DATABASE_USERNAME=$
–build-arg DATABASE_PASSWORD=$
–build-arg JWT_SECRET=$
–build-arg S3_ACCESS_KEY=$
–build-arg S3_SECRET_ACCESS_KEY=$ . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
# SSH로 EC2 인스턴스에 접속하여 Docker 컨테이너 재시작
- name: SSH into EC2 instance and restart Docker container uses: appleboy/ssh-action@master with: key: $ host: $ username: $ port: 22 script: | docker login -u AWS -p $(aws ecr get-login-password –region $) $ docker pull $/trello:latest sudo docker ps -a sudo docker stop $(docker ps -a -q) sudo docker ps -a sudo docker rm $(docker ps -a -q) sudo docker ps -a sudo docker images sudo docker run -d –name trello -p 3000:3000 $/trello:latest sudo docker ps -a sudo docker system prune -a -f sudo docker images
``` 전과 바꿔진 부분은 도커 허브 로그인이 사리지고 aws 로그인 후 ECR로그인이 들어갔다. 그후 Build, tag, and push image to Amazon ECR부분의
ECR_REGISTRY: $ 로그인하는 단계의 출력 결과 중 registry 값을 ECR_REGISTRY라는 변수로 설정하는데 사용. 이거때문에 프라이빗으로만 해야함 이값이 프라빗 옆에보면 숫자있고 dkr.ecc하고 .com으로 끝나는걸로 들어감.
ECR_REPOSITORY: trello 지금은 그냥 trello로 고정해놨는데 이거를 자기껄로 만들려면 $ 하고 시크릿키 저장하기.
마지막 태그는 latest
도커 컨테이너 pull받기 전에 ec2에 로그인 해야함. docker login -u AWS -p $(aws ecr get-login-password –region $) $ 이거 안하면 찾을 수 없다고 에러나옴.
pull받을때도 위에서 빌드한것처럼 docker pull $/$:latest
그리고 run 할때도 sudo docker run -d –name trello -p 3000:3000 $/trello:latest
위와 같이 해준다.
에러
Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root? 이게 뜨면 sudo killall apt apt-get sudo rm /var/lib/apt/lists/lock sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock* sudo dpkg –configure -a sudo apt update 하고 sudo apt-get install awscli 다시 하기
깃액션은 성공했는데 ec2 ip주소로 들어가 보면 안뜨는 경우는 EC2 instance and restart Docker container 보면 err: invalid reference format pull받을 이미지가 없다 pull부분이 틀리지 않았는지 확인. docker pull $ /$:latest
바꿔도 못알어먹을때는 pull하고 한칸 띄어쓰기 되어있는지 확인 이거 안되어있으면 pull부터 그후 registry를 도커 명령어로 봐서 그런 명령어 없다고 오류남..
참고 링크
https://blog.naver.com/shino1025/222586028036 EOF 에러 https://stackoverflow.com/questions/70828205/pushing-an-image-to-ecr-getting-retrying-in-seconds
중요한점
혹시 에러가 났는데 왜 났는지 모르겠으면 깃액션 하나하나씩 들어가서 error찾기. 도커가 run이 안되서 깃액션은 성공한것으로 처리됨.
Comments