Elastic Beanstalk에 CakePHP 애플리케이션 배포 - AWS Elastic Beanstalk

Elastic Beanstalk에 CakePHP 애플리케이션 배포

CakePHP는 PHP용 오픈 소스 MVC 프레임워크입니다. 이 자습서에서는 CakePHP 프로젝트를 생성하고, 이를 Elastic Beanstalk 환경에 배포하며, Amazon RDS 데이터베이스 인스턴스에 연결하도록 이를 구성하는 프로세스를 안내합니다.

사전 조건

이 자습서에서는 사용자가 기본 Elastic Beanstalk 작업 및 Elastic Beanstalk 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 아직 그렇지 않은 경우 Elastic Beanstalk 사용 시작하기의 지침에 따라 첫 Elastic Beanstalk 환경을 시작합니다.

이 설명서의 절차에 따르려면 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. 명령은 프롬프트 기호($)와 해당하는 경우 현재 디렉터리의 이름이 앞에 붙은 상태로 목록에 표시됩니다.

~/eb-project$ this is a command this is output

Linux 및 macOS에서 권장되는 셸과 패키지 관리자를 사용할 수 있습니다. Windows 10에서 Linux용 Windows Subsystem을 설치하여 Ubuntu와 Bash의 Windows 통합 버전을 가져옵니다.

CakePHP 4에는 PHP 7.2 이상이 필요합니다. 또한 공식 CakePHP 설치 설명서에 나열된 PHP 확장 기능이 필요합니다. PHP와 Composer를 설치하려면 PHP 개발 환경 설정 주제의 지침을 따르세요.

Elastic Beanstalk 환경 시작

Elastic Beanstalk 콘솔을 사용하여 Elastic Beanstalk 환경을 생성합니다. PHP 플랫폼을 선택하고 기본 설정과 샘플 코드를 적용합니다.

환경을 시작하려면(콘솔)
  1. 미리 구성된 다음 링크를 사용하여 Elastic Beanstalk 콘솔을 엽니다. console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. [플랫폼]에서 애플리케이션에 사용되는 언어와 일치하는 플랫폼 및 플랫폼 브랜치를 선택합니다.

  3. 애플리케이션 코드에서 샘플 애플리케이션을 선택합니다.

  4. 검토 및 시작을 선택합니다.

  5. 사용할 수 있는 옵션을 검토하십시오. 사용할 수 있는 옵션을 선택하고 준비가 되면 앱 생성을 선택합니다.

다음 리소스를 사용해 환경을 생성하는 데 약 5분 가량 걸립니다.

  • EC2 인스턴스(EC2 instance) - 선택한 플랫폼에서 웹 앱을 실행하도록 구성된 Amazon Elastic Compute Cloud(Amazon EC2) 가상 머신입니다.

    특정 언어 버전, 프레임워크, 웹 컨테이너 또는 그 조합을 지원하도록 각 플랫폼마다 특정 소프트웨어, 구성 파일 및 스크립트 세트를 실행합니다. 대부분의 플랫폼에서는 웹 앱 앞에 위치해 웹 앱으로 요청을 전달하고, 정적 자산을 제공하고, 액세스 및 오류 로그를 생성하는 역방향 프록시로 Apache 또는 NGINX를 사용합니다.

  • 인스턴스 보안 그룹(Instance security group) - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 로드 밸런서의 HTTP 트래픽이 웹 앱을 실행하는 EC2 인스턴스에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.

  • 로드 밸런서(Load balancer) - 애플리케이션을 실행하는 인스턴스로 요청을 분산하도록 구성된 Elastic Load Balancing 로드 밸런서입니다. 또한 로드 밸런서가 있으면 인터넷에 인스턴스를 직접 노출할 필요가 없습니다.

  • 로드 밸런서 보안 그룹(Load balancer security group) - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 인터넷의 HTTP 트래픽이 로드 밸런서에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.

  • Auto Scaling 그룹(Auto Scaling group) - 인스턴스가 종료되거나 사용할 수 없게 될 경우 인스턴스를 대체하도록 구성된 Auto Scaling 그룹입니다.

  • Amazon S3 버킷(Amazon S3 bucket) - Elastic Beanstalk 사용 시 생성된 소스 코드, 로그 및 기타 아티팩트의 스토리지 위치입니다.

  • Amazon CloudWatch 경보(Amazon CloudWatch alarms) - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 확장 또는 축소됩니다.

  • AWS CloudFormation 스택 – Elastic Beanstalk은 AWS CloudFormation을 사용하여 환경의 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 AWS CloudFormation 콘솔에서 볼 수 있는 템플릿에서 정의됩니다.

  • 도메인 이름(Domain name) - subdomain.region.elasticbeanstalk.com 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.

이러한 모든 리소스는 Elastic Beanstalk에서 관리합니다. 사용자가 환경을 종료하면 Elastic Beanstalk는 환경에 있는 모든 리소스를 종료합니다.

참고

Elastic Beanstalk에서 생성하는 Amazon S3 버킷은 환경 간에 공유되며 환경을 종료해도 삭제되지 않습니다. 자세한 내용은 Amazon S3에서 Elastic Beanstalk 사용을(를) 참조하세요.

CakePHP 설치 및 웹 사이트 생성

Composer는 명령 하나로 CakePHP를 설치하고 작업 중인 프로젝트를 만들 수 있습니다.

~$ composer create-project --prefer-dist cakephp/app eb-cake

Composer는 CakePHP와 종속 항목 약 20개를 설치한 후, 기본 프로젝트를 생성합니다.

CakePHP 설치 중에 문제가 발생한 경우 http://book.cakephp.org/4.0/en/installation.html에서 공식 설명서의 설치 항목을 참조하세요.

애플리케이션 배포

Composer가 생성한 파일이 포함된 소스 번들을 만듭니다. 다음 명령은 cake-default.zip이라는 이름의 소스 번들을 생성합니다. 많은 공간을 차지하고 애플리케이션을 Elastic Beanstalk에 배포하는 데 불필요한 vendor 폴더의 파일들은 제외됩니다.

eb-cake zip ../cake-default.zip -r * .[^.]* -x "vendor/*"

Elastic Beanstalk에 소스 번들을 업로드하여 CakePHP를 환경에 배포합니다.

소스 번들을 배포하려면
  1. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.

    참고

    환경이 많은 경우 검색 창을 사용하여 환경 목록을 필터링합니다.

  3. 환경 개요 페이지에서 [업로드 및 배포]를 선택합니다.

  4. 화면에 표시되는 대화 상자를 사용하여 소스 번들을 업로드합니다.

  5. 배포(Deploy)를 선택합니다.

  6. 배포가 완료되면 사이트 URL을 선택하여 새 탭에서 웹 사이트를 열 수 있습니다.

참고

소스 번들을 최적화 하려면 Git 리포지토리를 초기화하고 git archive 명령을 사용해 소스 번들을 생성합니다. 기본 Symfony 프로젝트에는 배포에 필요하지 않은 다른 파일과 .gitignore 폴더를 제외하라고 Git에 지시하는 vendor 파일이 포함되어 있습니다.

프로세스가 완료되면 URL을 클릭하여 브라우저에서 CakePHP 애플리케이션을 엽니다.

지금까지는 좋습니다. 그런 다음 환경에 데이터베이스를 추가하고 여기에 연결하도록 CakePHP를 구성합니다.

환경에 데이터베이스 추가

Elastic Beanstalk 환경에서 Amazon RDS 데이터베이스 인스턴스를 시작합니다. Elastic Beanstalk의 CakePHP에서 MySQL, SQLServer 또는 PostgreSQL 데이터베이스를 사용할 수 있습니다. 이 예에서는 PostgreSQL을 사용합니다.

Elastic Beanstalk 환경에 Amazon RDS DB 인스턴스를 추가하려면
  1. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.

    참고

    환경이 많은 경우 검색 창을 사용하여 환경 목록을 필터링합니다.

  3. 탐색 창에서 구성을 선택합니다.

  4. [데이터베이스]에서 [편집]을 선택합니다.

  5. DB 엔진에서 postgres를 선택합니다.

  6. 마스터 사용자 이름(username)암호(password)를 입력합니다. Elastic Beanstalk는 환경 속성을 사용하여 애플리케이션에 이 값을 제공합니다.

  7. 페이지 하단에서 적용(Apply)을 선택합니다.

데이터베이스 인스턴스를 만드는 데 약 10분이 걸립니다. 그 동안 소스 코드를 업데이트하여 환경에서 연결 정보를 읽을 수 있습니다. Elastic Beanstalk는 애플리케이션에서 액세스할 수 있는 RDS_HOSTNAME 등의 환경 변수를 사용하여 연결 세부 정보를 제공합니다.

CakePHP의 데이터베이스 구성은 프로젝트 코드의 app.php 폴더의 config 파일에 있습니다. 이 파일을 연 후 $_SERVER에서 환경 변수를 읽고 이를 로컬 변수에 할당하는 코드를 추가합니다. 첫 번째 줄(<?php) 뒤에 아래 예에서 강조 표시된 줄을 삽입합니다.

예 ~/Eb-cake/config/app.php
<?php if (!defined('RDS_HOSTNAME')) { define('RDS_HOSTNAME', $_SERVER['RDS_HOSTNAME']); define('RDS_USERNAME', $_SERVER['RDS_USERNAME']); define('RDS_PASSWORD', $_SERVER['RDS_PASSWORD']); define('RDS_DB_NAME', $_SERVER['RDS_DB_NAME']); } return [ ...

데이터베이스 연결이 app.php의 더 아래에 구성됩니다. 다음 섹션을 찾아 데이터베이스 엔진(Mysql, Sqlserver 또는 Postgres)과 일치하는 드라이버 이름을 사용하는 기본 데이터 원본 구성을 수정한 후 host, username, password, database 변수를 설정하여 Elastic Beanstalk에서 해당 값을 읽습니다.

예 ~/Eb-cake/config/app.php
... /** * Connection information used by the ORM to connect * to your application's datastores. * Drivers include Mysql Postgres Sqlite Sqlserver * See vendor\cakephp\cakephp\src\Database\Driver for complete list */ 'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Postgres', 'persistent' => false, 'host' => RDS_HOSTNAME, /* * CakePHP will use the default DB port based on the driver selected * MySQL on MAMP uses port 8889, MAMP users will want to uncomment * the following line and set the port accordingly */ //'port' => 'non_standard_port_number', 'username' => RDS_USERNAME, 'password' => RDS_PASSWORD, 'database' => RDS_DB_NAME, /* * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6). */ //'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => false, ...

DB 인스턴스 시작이 완료되면 업데이트된 애플리케이션을 번들링하여 환경에 배포합니다.

Elastic Beanstalk 환경을 업데이트하려면
  1. 새 소스 번들 만들기

    ~/eb-cake$ zip ../cake-v2-rds.zip -r * .[^.]* -x "vendor/*"
  2. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  3. 탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.

    참고

    환경이 많은 경우 검색 창을 사용하여 환경 목록을 필터링합니다.

  4. [Upload and Deploy]를 선택합니다.

  5. 찾아보기를 선택하고 cake-v2-rds.zip을 업로드합니다.

  6. 배포(Deploy)를 선택합니다.

애플리케이션의 새 버전을 배포하는 데 1분도 걸리지 않습니다. 배포가 완료되면 웹 페이지를 다시 새로 고쳐서 데이터베이스 연결에 성공했는지 확인합니다.

정리

Elastic Beanstalk 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 Amazon EC2 인스턴스, 데이터베이스 인스턴스, 로드 밸런서, 보안 그룹, 경보 등 환경과 연결된 모든 AWS 리소스를 종료합니다.

Elastic Beanstalk 환경을 종료하려면
  1. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.

    참고

    환경이 많은 경우 검색 창을 사용하여 환경 목록을 필터링합니다.

  3. 작업(Actions)을 선택한 후 환경 종료(Terminate Environment)를 선택합니다.

  4. 화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.

Elastic Beanstalk로 언제든지 애플리케이션을 위한 새로운 환경을 쉽게 생성할 수 있습니다.

또한 Elastic Beanstalk 환경 외부에서 생성한 데이터베이스 리소스를 종료할 수 있습니다. Amazon RDS DB 인스턴스를 종료하면 스냅샷을 생성하고 나중에 이 데이터를 다른 인스턴스로 복원할 수 있습니다.

RDS DB 인스턴스를 종료하려면
  1. Amazon RDS 콘솔을 엽니다.

  2. 데이터베이스를 선택합니다.

  3. DB 인스턴스를 선택합니다.

  4. [ Actions]를 선택한 후 [Delete]를 선택합니다.

  5. 스냅샷을 만들지 선택한 후 삭제를 선택합니다.

다음 단계

CakePHP에 대한 자세한 내용은 book.cakephp.org의 책을 참조하세요.

애플리케이션을 계속 개발하다 보면 .zip 파일을 수동으로 생성하여 이를 Elastic Beanstalk 콘솔에 업로드하지 않고도 환경을 관리하고 애플리케이션을 배포할 수 있는 방법이 필요할 것입니다. Elastic Beanstalk 명령줄 인터페이스(EB CLI)는 명령줄에서 애플리케이션을 만들고 구성하고 Elastic Beanstalk 환경에 배포하기 위한 사용하기 쉬운 명령을 제공합니다.

Elastic Beanstalk 환경에서 Amazon RDS DB 인스턴스를 실행하는 것은 개발 및 테스트에는 적합하지만, 데이터베이스의 수명 주기를 환경에 연결합니다. 환경 외부에서 실행되는 데이터베이스에 연결하는 방법은 Amazon RDS DB 인스턴스를 PHP 애플리케이션 환경에 추가을(를) 참조하세요.

마지막으로, 프로덕션 환경에서 애플리케이션을 사용하려면 환경에 대한 사용자 지정 도메인 이름을 구성하고 보안 연결을 위해 HTTPS를 활성화할 수 있습니다.