1. 환경 설명

1.1. 프로젝트 개요

PHP 5.6 버전을 사용하는 웹 애플리케이션의 CI/CD(지속적 통합 및 지속적 배포) 파이프라인을 구축합니다. 이 파이프라인은 자동화된 빌드, 테스트, 배포 과정을 통해 효율적인 개발과 배포를 지원합니다.

1.2. 사용 기술

  • PHP 5.6: 웹 애플리케이션을 위한 서버 사이드 스크립팅 언어
  • Linux 2: AWS EC2 인스턴스에서 사용할 운영 체제
  • Git: 소스 코드 버전 관리
  • Docker: 애플리케이션 컨테이너화
  • Amazon ECR (Elastic Container Registry): Docker 이미지를 저장하는 컨테이너 레지스트리
  • Amazon Elastic Beanstalk (EB): 애플리케이션 배포 및 관리 플랫폼
  • AWS CodeCommit: Git 기반의 소스 코드 리포지토리
  • AWS CodeBuild: 소스 코드의 빌드 및 테스트 자동화
  • AWS CodePipeline: CI/CD 파이프라인 구성 및 관리

 

2. 환경 설정

2.1. Git 설정

  • CodeRepository를 저장소로 사용하였고, git 설정 가이드가 필요하다면 아래 링크를 이용하시기 바랍니다.
  • https://yes5.tistory.com/42
 

git 설치와 AWS code repository 생성

Git 설치Git 설치는 운영 체제에 따라 다릅니다. 아래에 Windows, macOS, 그리고 Linux에 대한 설치 방법을 설명합니다.WindowsGit 공식 사이트에 접속하여 최신 Git 설치 파일을 다운로드합니다.다운로드한

yes5.tistory.com

 

 

2.2. Docker 설정

  • Docker 설치 및 설정: PHP 5.6을 위한 Docker 이미지를 설정합니다.
  • 아래  코드를 Dockerfile로 생성합니다.
  • 파일 생성 후 git push 하여 Dockerfile을 Git repository의 root 디렉토리에 push합니다.
# Step 1: Base Image from AWS ECR Public Gallery
FROM public.ecr.aws/amazonlinux/amazonlinux:2

# Step 2: Install EPEL repository and Remi repository
RUN yum install -y amazon-linux-extras \
    && amazon-linux-extras install epel -y \
    && yum install -y yum-utils \
    && yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm \
    && yum install -y sed

# Step 3: Enable PHP 5.6 repository
RUN yum-config-manager --enable remi-php56

# Step 4: Install Apache and PHP 5.6 with required extensions
RUN yum install -y \
    httpd \
    php \
    php-cli \
    php-common \
    php-devel \
    php-mbstring \
    php-xml \
    php-mysqlnd

# Step 5: Update all packages to apply latest security patches
RUN yum update -y

# Step 6: Clean up cached files to reduce image size
RUN yum clean all \
    && rm -rf /var/cache/yum

# Step 7: Use sed to modify php.ini configuration
# Note: php.ini should exist in the container by default
RUN sed -i 's/short_open_tag = Off/short_open_tag = On/' /etc/php.ini

# Step 8: Copy application source code to the container
COPY . /var/www/html/

# Step 9: Expose the necessary port (default: 80 for Apache)
EXPOSE 80

# Step 10: Start the Apache server
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

 

  • Docker 빌드 및 로그 확인 : 빌드 후 로그 확인과 브라우저에서 동작을 확인합니다.
#빌드 및 실행(-v /var/www:/var/www: 호스트의 /var/www 디렉토리를 컨테이너의 /var/www 디렉토리에 마운트)
docker build -t my-php-app .
docker run -d -p 80:80 --name my-php-app -v /var/www:/var/www my-php-app

#컨테이너 로그 확인
docker logs my-php-app

 

 

3. Docker 이미지 ECR에 푸시하기

이제 로컬에서 빌드한 Docker 이미지를 Amazon ECR로 푸시하는 방법을 알아보겠습니다.

3.1 ECR 로그인

먼저, AWS CLI를 사용하여 Docker를 ECR에 로그인시켜야 합니다. 아래 명령어를 실행하면 됩니다

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <ECR URI 주소>

 

이 명령어는 ECR에 대한 Docker 인증 정보를 구성합니다.

 

3.2 이미지 태그 지정

이미 로컬에서 빌드된 my-amazonlinux-php-app 이미지를 ECR에 맞게 태그를 지정합니다

docker tag my-amazonlinux-php-app:latest <ECR URI 주소>/my-php-app:latest

 

3.3 Docker 이미지 푸시

이제 이미지를 ECR 리포지토리로 푸시합니다

docker push <ECR URI 주소>/my-php-app:latest

 

 

4. ECR에서 이미지 풀(pull) 받아 Docker 컨테이너 실행하기

푸시된 이미지를 다른 서버나 로컬에서 사용할 수 있도록 ECR에서 풀(pull) 받아 Docker 컨테이너로 실행하는 방법을 설명하겠습니다.

 

이미 실행중인 컨테이너가 있다면 종료 후 삭제합니다.

docker ps
docker stop my-php-app
docker rm my-php-app

[실행중인 컨테이너 삭제]
docker stop $(docker ps -q)
docker rm $(docker ps -aq)

 

4.1 ECR 로그인

다른 서버나 로컬 환경에서 ECR에서 이미지를 풀(pull) 받기 전에, 먼저 ECR에 로그인해야 합니다

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <ECR URI 주소>

 

4.2 ECR에서 이미지 풀(pull)

ECR에서 이미지를 풀(pull) 받습니다

docker pull <ECR URI 주소>/my-php-app:latest

 

4.3 Docker 컨테이너 실행

풀(pull) 받은 이미지를 사용하여 Docker 컨테이너를 실행합니다

docker run -d -p 80:80 --name my-php-app -v /var/www:/var/www <ECR URI 주소>/my-php-app:latest

 

 

5. AWS CodeBuild 설정 및 사용

AWS CodeBuild는 소스 코드를 빌드하고, 자동으로 테스트와 패키징을 진행하는 빌드 서비스입니다. 이 단계에서는 CodeBuild를 생성하고 설정하여, 애플리케이션 빌드 및 배포 파이프라인을 완성하겠습니다.

 

5.1 CodeBuild 프로젝트 생성

  1. AWS 콘솔에 로그인한 후, CodeBuild 서비스로 이동합니다.
  2. 프로젝트 생성 버튼을 클릭합니다.
  3. 프로젝트 이름을 설정합니다. 예를 들어, my-php-app-build와 같이 명명할 수 있습니다.

 

5.2 환경 설정

  1. 소스 공급자에서 AWS CodeCommit을 선택하고, 앞서 만든 리포지토리(2번 항목 Git 생성)와 브랜치(master)를 선택합니다.
  2. 빌드 환경에서 환경 이미지를 설정합니다.
    • 운영체제: Amazon Linux를 선택합니다.
    • 런타임: Standard를 선택합니다.
    • 이미지: aws/codebuild/amazonlinux2-x86_64-standard:5.0 등 최신 버전의 이미지를 선택합니다.
    • 빌드 사양: 빌드 명령 삽입을 선택합니다. 아래 buildspec.yml 내용을 입력합니다.
version: 0.2

env:
  variables:
    REPOSITORY_URI: <생성된 ECR의 URI주소로 변경>
    IMAGE_TAG: latest
    AWS_REGION: ap-northeast-2
    IMAGE_NAME: my-php-app

phases:
  install:
    commands:
      - echo Installing dependencies...
      # Docker는 기본적으로 설치되어 있어야 하므로, 필요 시 추가 작업을 여기에 명시할 수 있습니다.
      # 예: sudo yum install -y docker

  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REPOSITORY_URI

  build:
    commands:
      - echo Building the Docker image...
      - docker build -t $IMAGE_NAME .
      - docker tag $IMAGE_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG

  post_build:
    commands:
      - echo Pushing the Docker image to ECR...
      - docker push $REPOSITORY_URI:$IMAGE_TAG

artifacts:
  files:
    - '**/*'

 

 

5.3 artifact  설정 

  1. 유형으로 S3를 선택합니다. 
  2. 사용할 서비스명으로 S3를 생성합니다.
  3. 아티팩트 패키징에서 Zip 설정합니다.

 

 5.3 build 실행 

  1. 빌드 시작으로 오류가 없는지 Test합니다. 
  2. 이상이 없다면 빌드 상태가 성공함으로 표시됩니다.

 

 

 

6. Elastic Beanstalk(EB)에 애플리케이션 배포하기

AWS Elastic Beanstalk는 애플리케이션을 쉽고 빠르게 배포할 수 있는 관리형 서비스로, 인프라 프로비저닝, 로드 밸런싱, 오토스케일링 등의 기능을 자동으로 제공합니다. 이 과정에서는 ECR에 저장된 Docker 이미지를 사용해 Elastic Beanstalk 환경에 애플리케이션을 배포하는 방법을 설명하겠습니다.

 

6.1 Elastic Beanstalk 환경 생성

  1. AWS 콘솔에 로그인한 후, Elastic Beanstalk 서비스로 이동합니다.
  2. 환경 생성 단계로 이동하여 아래와 같이 설정합니다.
    • 어플리케이션 이름: 적절한 이름을 지정합니다. 예를 들어, my-php-app와 같이 설정할 수 있습니다.
    • 환경 이름: 예를 들어, my-php-app-prod와 같이 설정할 수 있습니다.
    • 환경 정보: 여기서 환경 유형으로 웹 서버 환경을 선택합니다.

 

6.2 플랫폼 설정

Elastic Beanstalk는 Docker 컨테이너 이미지를 통해 애플리케이션을 실행할 수 있습니다. 

  1. Docker 플랫폼을 선택:
    • 플랫폼 브랜치: Docker running on 64bit Amazon Linux2
    • 플랫폼 버전:  4.0.1
  2.  애플리케이션 코드 와 서전 설정은 기본 설정으로 선택합니다. (고가용성, LB 배포 설정 등은 다루지 않습니다.)

 

 

6.3 서비스 액세스 설정

 

https://yes5.tistory.com/55

 

Elastic Beanstalk을 위한 IAM 정책 및 역할 생성

Elastic Beanstalk 소개Elastic Beanstalk은 AWS에서 제공하는 관리형 서비스로, 웹 애플리케이션과 서비스를 쉽게 배포하고 관리할 수 있게 해줍니다. 개발자는 인프라 관리에 신경 쓰지 않고 코드를 업로

yes5.tistory.com

 

 

6.4 기타 설정

  1. 네트워크 VPC는 어플리케이션 서비스에 맞게 설정합니다.
  2. 데이터베이스는 이 포스팅에선 EC2로 사용하고 있기 때문에 설정하지 않습니다.
  3. Autoscale, 모니터링, 업데이트 등 기본 설정.
  4. Nginx Proxy도 설정하지 않습니다. 

 

 

7. CodePipeline으로 CI/CD 파이프라인 구성하기

AWS CodePipeline은 CI/CD 파이프라인을 자동으로 구성하고 관리하는 서비스입니다. 이 서비스를 통해 코드 변경이 발생할 때마다 소스 코드가 자동으로 빌드되고, 테스트된 후 배포까지 진행될 수 있습니다.

7.1 CodePipeline 생성

  1. AWS 콘솔에 로그인한 후, CodePipeline 서비스로 이동합니다.
  2. 파이프라인 생성 버튼을 클릭합니다.
    • 파이프라인 이름: 적절한 이름을 설정합니다. 예를 들어, my-php-app-pipeline과 같이 설정할 수 있습니다.
    • 새 서비스 역할 생성을 선택하여 CodePipeline이 리소스에 접근할 수 있도록 권한을 설정합니다.
    • 고급 설정: code build 단계에서 생성한 S3 버킷을 지정합니다.

 

7.2 소스(Stage 1) 설정

소스는 애플리케이션 코드가 저장된 곳에서 가져옵니다. 우리는 AWS CodeCommit을 사용하고 있으므로 이를 연결합니다.

  1. 소스 공급자: AWS CodeCommit을 선택합니다.
  2. 리포지토리 이름: 애플리케이션의 리포지토리를 선택합니다. 예: php56-app-repo
  3. 브랜치: 트리거할 브랜치를 선택합니다. 예: main 또는 master
  4. CodePipeline은 이 브랜치에 코드가 푸시될 때마다 자동으로 파이프라인을 실행합니다.

 

 

7.3 빌드(Stage 2) 설정

빌드 단계에서는 AWS CodeBuild를 사용하여 Docker 이미지를 빌드하고 ECR에 푸시하는 작업을 자동화합니다.

  1. 빌드 공급자: AWS CodeBuild를 선택합니다.
  2. 프로젝트 이름: 이전 단계에서 설정한 CodeBuild 프로젝트를 선택합니다. 예: my-php-app-build
  3. CodeBuild가 소스 코드를 가져와 Docker 이미지를 빌드하고, ECR로 푸시하는 작업을 수행합니다.

 

7.4 배포(Stage 3) 설정

배포 단계에서는 Amazon Elastic Beanstalk를 사용하여 애플리케이션을 자동으로 배포합니다.

  1. 배포 공급자: Amazon Elastic Beanstalk를 선택합니다.
  2. 애플리케이션 이름: Elastic Beanstalk에서 설정한 애플리케이션을 선택합니다. 예: my-php-app
  3. 환경 이름: 이전 단계에서 생성한 환경을 선택합니다. 예: my-php-app-prod

 

7.5 파이프라인 실행

설정이 완료되면 파이프라인 생성 버튼을 클릭합니다. 생성된 파이프라인은 지정된 소스 브랜치에 새로운 코드가 푸시되면 자동으로 실행됩니다.

  • 소스 변경: 개발자가 Git 리포지토리에 코드를 푸시합니다.
  • 빌드 단계: CodeBuild가 트리거되어 Docker 이미지를 빌드하고 ECR로 푸시합니다.
  • 배포 단계: 빌드된 이미지를 Elastic Beanstalk가 받아서 애플리케이션 환경에 배포합니다.

7.6 파이프라인 모니터링 및 관리

파이프라인이 실행될 때마다 AWS 콘솔에서 파이프라인의 상태를 실시간으로 모니터링할 수 있습니다.

  • 실행 상태 확인: 각 단계가 정상적으로 완료되었는지 확인할 수 있습니다. 빌드 실패나 배포 실패 등의 오류가 발생하면 자세한 로그를 통해 문제를 분석할 수 있습니다.
  • 재실행 및 수정: 오류가 발생한 경우, 파이프라인을 수정하거나 개별 단계만 다시 실행할 수 있습니다.

+ Recent posts