Laravel + Nuxt + Fargate에 CodePipeline으로 지속적인 배포
14544 단어 nuxtFargate라라벨CodePipelineAWS
전제
Laradock + Nuxt(SSR 모드)를 AWS Fargate에서 실행
여기에서 Fargate로 시작할 수있는 것
하고 싶은 일
github 소스 코드가 master 브랜치로 푸시 될 때 CodeBuild로 Docker 이미지를 빌드합니다.
Fargate에 배포 자동화
가능하면 테스트도 실시
참고
Laravel 애플리케이션을 로컬 또는 AWS에서 Docker로 이동
Laravel 애플리케이션을 CodePipeline/CodeBuild로 ECS에 자동 배포
Laravel의 세션 관리에 Redis를 지정하고 AWS의 ElastiCache 사용
절차
github 소스 코드가 master 브랜치로 푸시 될 때 CodeBuild로 Docker 이미지를 빌드합니다.
Fargate에 배포 자동화
가능하면 테스트도 실시
참고
Laravel 애플리케이션을 로컬 또는 AWS에서 Docker로 이동
Laravel 애플리케이션을 CodePipeline/CodeBuild로 ECS에 자동 배포
Laravel의 세션 관리에 Redis를 지정하고 AWS의 ElastiCache 사용
절차
buildspec.yml 추가
소스 코드 프로젝트의 디렉토리 바로 아래에
build시의 실행 내용을 기재한다
touch buildspec.yml
buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
## awsにログインする
- $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
## s3からenvファイルを取得する
- aws s3 cp s3://${BUCKET_NAME}/staging/env .env
- echo ls -l -a
## nginxとphp-fpmコンテナイメージのECRリポジトリURIを生成する
- REPOSITORY_URI_PHP_FPM=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME_PHP_FPM}
- REPOSITORY_URI_NGINX=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME_NGINX}
## ここは何をしてる?
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t ${REPOSITORY_URI_PHP_FPM}:latest -f docker/php-fpm/Dockerfile .
- docker build -t ${REPOSITORY_URI_NGINX}:latest -f docker/nginx/Dockerfile .
- docker tag ${REPOSITORY_URI_PHP_FPM}:latest ${REPOSITORY_URI_PHP_FPM}:$IMAGE_TAG
- docker tag ${REPOSITORY_URI_NGINX}:latest ${REPOSITORY_URI_NGINX}:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push ${REPOSITORY_URI_PHP_FPM}:latest
- docker push ${REPOSITORY_URI_PHP_FPM}:$IMAGE_TAG
- docker push ${REPOSITORY_URI_NGINX}:latest
- docker push ${REPOSITORY_URI_NGINX}:$IMAGE_TAG
- echo Writing image definitions file...
## コンテナ定義の更新するためのファイルを作成する
- IMAGE_DIFINITION_PHP_FPM="{\"name\":\"${PHP_FPM_CONTAINER_NAME}\",\"imageUri\":\"${REPOSITORY_URI_PHP_FPM}:${IMAGE_TAG}\"}"
- IMAGE_DIFINITION_NGINX="{\"name\":\"${NGINX_CONTAINER_NAME}\",\"imageUri\":\"${REPOSITORY_URI_NGINX}:${IMAGE_TAG}\"}"
- echo "[${IMAGE_DIFINITION_PHP_FPM},${IMAGE_DIFINITION_NGINX}]" > imagedefinitions.json
artifacts:
files: imagedefinitions.json
컨테이너 시작시 php artisan migrate를 실행하도록 설정
마이그레이션을 위해 명령을 시작할 때 실행하는 명령 추가
/docker/php-fpm/startup.sh
#!/bin/bash
+ # migrate lunch
+ php artisan cache:clear
+ php artisan migrate
# php-fpm sever lunch
php-fpm
github 리포지토리 만들기
push 대상 github 리포지토리를 만들고 로컬 프로젝트로 이동
소스 코드 push
cd ./{プロジェクト名}/
echo "# guild-app" >> README.md
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/hajime1103/guild-app.git
git push -u origin master
AmazonAurora를 구축하고 테이블을 만들 때까지 가능
touch buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
## awsにログインする
- $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
## s3からenvファイルを取得する
- aws s3 cp s3://${BUCKET_NAME}/staging/env .env
- echo ls -l -a
## nginxとphp-fpmコンテナイメージのECRリポジトリURIを生成する
- REPOSITORY_URI_PHP_FPM=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME_PHP_FPM}
- REPOSITORY_URI_NGINX=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME_NGINX}
## ここは何をしてる?
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t ${REPOSITORY_URI_PHP_FPM}:latest -f docker/php-fpm/Dockerfile .
- docker build -t ${REPOSITORY_URI_NGINX}:latest -f docker/nginx/Dockerfile .
- docker tag ${REPOSITORY_URI_PHP_FPM}:latest ${REPOSITORY_URI_PHP_FPM}:$IMAGE_TAG
- docker tag ${REPOSITORY_URI_NGINX}:latest ${REPOSITORY_URI_NGINX}:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push ${REPOSITORY_URI_PHP_FPM}:latest
- docker push ${REPOSITORY_URI_PHP_FPM}:$IMAGE_TAG
- docker push ${REPOSITORY_URI_NGINX}:latest
- docker push ${REPOSITORY_URI_NGINX}:$IMAGE_TAG
- echo Writing image definitions file...
## コンテナ定義の更新するためのファイルを作成する
- IMAGE_DIFINITION_PHP_FPM="{\"name\":\"${PHP_FPM_CONTAINER_NAME}\",\"imageUri\":\"${REPOSITORY_URI_PHP_FPM}:${IMAGE_TAG}\"}"
- IMAGE_DIFINITION_NGINX="{\"name\":\"${NGINX_CONTAINER_NAME}\",\"imageUri\":\"${REPOSITORY_URI_NGINX}:${IMAGE_TAG}\"}"
- echo "[${IMAGE_DIFINITION_PHP_FPM},${IMAGE_DIFINITION_NGINX}]" > imagedefinitions.json
artifacts:
files: imagedefinitions.json
#!/bin/bash
+ # migrate lunch
+ php artisan cache:clear
+ php artisan migrate
# php-fpm sever lunch
php-fpm
push 대상 github 리포지토리를 만들고 로컬 프로젝트로 이동
소스 코드 push
cd ./{プロジェクト名}/
echo "# guild-app" >> README.md
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/hajime1103/guild-app.git
git push -u origin master
AmazonAurora를 구축하고 테이블을 만들 때까지 가능
DB 배포용 프라이빗 서브넷 만들기
프라이빗 서브넷용 라우팅 테이블 만들기
RDS에서 서브넷 그룹 만들기
RDS에서 Aurora 매개 변수 그룹 만들기
파라미터 그룹과 DB 클러스터 파라미터 그룹 모두 생성
AuroraDB 만들기
※보안 그룹을 새롭게 작성하는 경우는, 허가하는 인바운드 설정을 Fargate로부터에서도 액세스 할 수 있도록 해 둔다
laravel의 database.php 변경
Aurora는 기본적으로 읽기 및 쓰기 전용을 생성하기 때문에
엔드포인트를 전환해야 함
참고 사이트
Laravel의 DB 마스터 / 슬레이브로 마스터로 SELECT하거나 슬레이브로 트랜잭션
/config/database.php
- 'host' => env('DB_HOST', '127.0.0.1'),
- 'port' => env('DB_PORT', '3306'),
+ 'read' => [
+ 'host' => env('DB_SLAVE_HOST', '127.0.0.1'),
+ 'port' => env('DB_SLAVE_PORT', '3306'),
+ ],
+ 'write' => [
+ 'host' => env('DB_MASTER_HOST', '127.0.0.1'),
+ 'port' => env('DB_MASTER_PORT', '3306'),
+ ],
프로덕션/스테이징 환경용 env 파일을 함께 수정하여 S3 버킷에 업로드
DB_CONNECTION=mysql
DB_MASTER_HOST={書き込み専用エンドポイント}
DB_MASTER_PORT={ポート番号}
DB_SLAVE_HOST={読み込み専用エンドポイント}
DB_SLAVE_PORT={ポート番号}
DB_DATABASE=XXXX
DB_USERNAME=XXXX
DB_PASSWORD=XXXX
CodePipeline 만들기
CodePipeline 새로 만들기
리포지토리는 github를 선택합니다.
AWS CodeBuild를 생성하고 새 프로젝트 생성
환경 변수 정의
환경 변수 이름
개요
AWS_ACCOUNT_ID
ECR의 저장소 ID
BUCKET_NAME
.env 파일이 있는 S3 버킷
IMAGE_NAME_PHP_FPM
php-fpm 컨테이너 ECR의 리포지토리 이름
IMAGE_NAME_NGINX
nginx 컨테이너 ECR의 리포지토리 이름
PHP_FPM_CONTAINER_NAME
ECS 작업의 php-fpm 컨테이너 이름
NGINX_CONTAINER_NAME
ECS 태스크의 nginx 컨테이너 이름
배포 대상인 AmazonECS를 선택합니다.
배포 설정
빌드 실행
빌드를 실행하면 다음 오류가 발생합니다.
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::636990608596:assumed-role/codebuild-GuildApp-CodeBuild-service-role/AWSCodeBuild-c714c40b-8e5e-466d-9d97-fda2158797d4 is not authorized to perform: ecr:GetAuthorizationToken on resource: *
[Container] 2019/03/26 16:04:29 Command did not exit successfully $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}) exit status 255
[Container] 2019/03/26 16:04:29 Phase complete: PRE_BUILD Success: false
[Container] 2019/03/26 16:04:29 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}). Reason: exit status 255
롤이 부족한 것 같아
【비망록】CodeBuild에서 aws ecr get-login 명령 실행시에 에러가 발생한다
.env 파일을 S3에서 가져오고 ECR에 액세스하기 위해
아래 롤을 부착했습니다.
AmazonEC2ContainerRegistryPowerUser
AmazonS3ReadOnlyAccess
CodePipeline에서 배포할 수 있는지 확인
Reference
이 문제에 관하여(Laravel + Nuxt + Fargate에 CodePipeline으로 지속적인 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gemetasu1103/items/cce747c6bf4f13da54d4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::636990608596:assumed-role/codebuild-GuildApp-CodeBuild-service-role/AWSCodeBuild-c714c40b-8e5e-466d-9d97-fda2158797d4 is not authorized to perform: ecr:GetAuthorizationToken on resource: *
[Container] 2019/03/26 16:04:29 Command did not exit successfully $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}) exit status 255
[Container] 2019/03/26 16:04:29 Phase complete: PRE_BUILD Success: false
[Container] 2019/03/26 16:04:29 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}). Reason: exit status 255
Reference
이 문제에 관하여(Laravel + Nuxt + Fargate에 CodePipeline으로 지속적인 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gemetasu1103/items/cce747c6bf4f13da54d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)