

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Elastic Beanstalk에 Laravel 애플리케이션 배포
<a name="php-laravel-tutorial"></a>

Laravel은 PHP용 오픈 소스 MVC(모델-보기-컨트롤러) 프레임워크입니다 이 자습서에서는 Laravel 애플리케이션을 생성하고, AWS Elastic Beanstalk 환경에 배포하고, Amazon Relational Database Service(RDS) 데이터베이스 인스턴스에 연결하도록 구성하는 프로세스를 안내합니다.

**Topics**
+ [사전 조건](#php-laravel-tutorial-prereqs)
+ [Elastic Beanstalk 환경 시작](#php-laravel-tutorial-launch)
+ [Laravel 설치 및 웹 사이트 생성](#php-laravel-tutorial-generate)
+ [애플리케이션 배포](#php-laravel-tutorial-deploy)
+ [Composer 설정 구성](#php-laravel-tutorial-configure)
+ [환경에 데이터베이스 추가](#php-laravel-tutorial-database)
+ [정리](#php-laravel-tutorial-cleanup)
+ [다음 단계](#php-laravel-tutorial-nextsteps)

## 사전 조건
<a name="php-laravel-tutorial-prereqs"></a>

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

이 설명서의 절차를 수행하기 위해서는 실행 명령줄을 입력할 쉘 또는 터미널이 필요합니다. 명령은 프롬프트 기호($)와 해당하는 경우 현재 디렉터리 이름 뒤에 리스트로 표시됩니다.

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

Linux 및 macOS의 경우 선호하는 쉘과 패키지 관리자를 사용할 수 있습니다. Windows의 경우 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)하여 Ubuntu 및 Bash의 Windows 통합 버전을 가져옵니다.

Laravel 6에는 PHP 7.2 이상이 필요합니다. 또한 공식 Laravel 설명서의 [서버 요구 사항](https://laravel.com/docs/6.x/installation#server-requirements) 항목에 나열된 PHP 확장 기능이 필요합니다. PHP와 Composer를 설치하려면 지침을 따르세요.

Laravel 지원 및 유지 관리 정보는 공식 Laravel 설명서의 [지원 정책](https://laravel.com/docs/master/releases#support-policy) 항목을 참조하세요.

## Elastic Beanstalk 환경 시작
<a name="php-laravel-tutorial-launch"></a>

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

**환경을 시작하려면(콘솔)**

1. 미리 구성된 다음 링크를 사용하여 Elastic Beanstalk 콘솔을 엽니다. [console.aws.amazon.com/elasticbeanstalk/home\#/newApplication?applicationName=tutorials&environmentType=LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

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

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

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

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

다음 리소스를 사용해 환경을 생성하는 데 약 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 그룹이 확장 또는 축소됩니다.
+ **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
+ **도메인 이름(Domain name)** - *{{subdomain}}.{{region}}.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.
**도메인 보안**  
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 *elasticbeanstalk.com* 도메인이 [공개 서픽스 목록(PSL)](https://publicsuffix.org/)에 등록되어 있습니다.  
Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해 `__Host-` 접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 페이지를 참조하세요.

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

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

## Laravel 설치 및 웹 사이트 생성
<a name="php-laravel-tutorial-generate"></a>

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

```
~$ composer create-project --prefer-dist laravel/laravel eb-laravel
```

Composer는 Laravel과 종속 항목을 설치한 후, 기본 프로젝트를 생성합니다.

Laravel 설치 중 문제가 발생한 경우 [https://laravel.com/docs/6.x](https://laravel.com/docs/6.x)에서 공식 설명서의 설치 항목을 참조하세요.

## 애플리케이션 배포
<a name="php-laravel-tutorial-deploy"></a>

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

```
~/eb-laravel$ zip ../laravel-default.zip -r * .[^.]* -x "vendor/*"
```

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

**소스 번들을 배포하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

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

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

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

**참고**  
소스 번들을 최적화 하려면 Git 리포지토리를 초기화하고 [`git archive` 명령](applications-sourcebundle.md#using-features.deployment.source.git)을 사용해 소스 번들을 생성합니다. 기본 Laravel 프로젝트에는 배포에 필요하지 않은 다른 파일과 `.gitignore` 폴더를 제외하라고 Git에 지시하는 `vendor` 파일이 포함되어 있습니다.

## Composer 설정 구성
<a name="php-laravel-tutorial-configure"></a>

배포가 완료되면 URL을 클릭하여 브라우저에서 Laravel 애플리케이션을 엽니다.

![403 사용자에게 요청된 리소스에 액세스할 권한이 없음을 나타내는 금지된 오류 페이지입니다.](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/php-laravel-403.png)


이것은 무엇일까요? 기본적으로 Elastic Beanstalk는 웹 사이트의 루트 경로에 프로젝트 루트를 제공합니다. 그러나 이 경우 기본 페이지(`index.php`)는 `public` 폴더의 한 단계 아래에 있습니다. URL에 `/public`을 추가하여 이를 확인할 수 있습니다. 예를 들어 `http://{{laravel}}.{{us-east-2}}.elasticbeanstalk.com/public`입니다.

루트 경로에 Laravel 애플리케이션을 저장하려면 Elastic Beanstalk 콘솔을 사용하여 웹 사이트에 대한 *문서 루트*를 구성합니다.

**웹 사이트의 문서 루트 구성**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

1. **업데이트, 모니터링 및 로깅** 구성 범주에서 **편집**을 선택합니다.

1. **문서 루트**에 **/public**을 입력합니다.

1. 변경 사항을 저장하려면 페이지 하단에서 **적용**을 선택합니다.

1. 업데이트가 완료되면 URL을 클릭하여 브라우저에서 사이트를 다시 엽니다.

![탐색 메뉴 항목이 포함된 Laravel 로고: Documentation, Laracasts, News, Forge, GitHub.](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/php-laravel-defaultnodb.png)


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

## 환경에 데이터베이스 추가
<a name="php-laravel-tutorial-database"></a>

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

**Elastic Beanstalk 환경에 RDS DB 인스턴스를 추가하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

1. **데이터베이스** 구성 범주에서 **편집**을 선택합니다.

1. **엔진**에서 **mysql**을 선택합니다.

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

1. 변경 사항을 저장하려면 페이지 하단에서 **적용**을 선택합니다.

데이터베이스 인스턴스를 만드는 데 약 10분이 걸립니다. Elastic Beanstalk 환경에 결합된 데이터베이스에 대한 자세한 내용은 [Elastic Beanstalk 환경에 데이터베이스 추가](using-features.managing.db.md)을(를) 참조하세요.

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

Laravel의 데이터베이스 구성은 프로젝트 코드에서 `database.php` 폴더의 `config` 파일에 저장되어 있습니다. Elastic Beanstalk에서 상응하는 값을 읽어오기 위해 `mysql` 항목을 찾고 `host`, `database`, `username`, `and password` 변수를 수정합니다.

**Example \~/Eb-laravel/config/database.php**  

```
...
    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('RDS_HOSTNAME', '127.0.0.1'),
            'port' => env('RDS_PORT', '3306'),
            'database' => env('RDS_DB_NAME', 'forge'),
            'username' => env('RDS_USERNAME', 'forge'),
            'password' => env('RDS_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
...
```

데이터베이스 연결이 제대로 구성되었는지 확인하려면, `index.php`에 코드를 추가하여 데이터베이스에 연결한 후 기본 응답에 일부 코드를 추가합니다.

**Example \~/Eb-laravel/public/index.php**  

```
...
if(DB::connection()->getDatabaseName())
{
   echo "Connected to database ".DB::connection()->getDatabaseName();
}
$response->send();
...
```

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

**Elastic Beanstalk 환경을 업데이트하려면**

1. 새 소스 번들 만들기

   ```
   ~/eb-laravel$ zip ../laravel-v2-rds.zip -r * .[^.]* -x "vendor/*"
   ```

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

1. **찾아보기**를 선택한 후 `laravel-v2-rds.zip`을 업로드합니다.

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

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

![ebdb에 대한 데이터베이스 연결 성공을 보여주는 Laravel 애플리케이션 홈페이지입니다.](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/php-laravel-defaultwdb.png)


## 정리
<a name="php-laravel-tutorial-cleanup"></a>

데모 코드 작업을 마치면 환경을 종료할 수 있습니다. Elastic Beanstalk는 [Amazon EC2 인스턴스](using-features.managing.ec2.md), [데이터베이스 인스턴스](using-features.managing.db.md), [로드 밸런서](using-features.managing.elb.md), 보안 그룹 및 [경보](using-features.alarms.md#using-features.alarms.title)와 같은 모든 관련 AWS 리소스를 삭제합니다.

리소스를 제거해도 Elastic Beanstalk 애플리케이션은 삭제되지 않으므로 언제든 애플리케이션을 위한 새 환경을 생성할 수 있습니다.

**콘솔에서 Elastic Beanstalk 환경을 종료하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

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

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

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

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

**RDS DB 인스턴스를 종료하려면**

1. [Amazon RDS 콘솔](https://console.aws.amazon.com/rds)을 엽니다.

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

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

1. **작업**을 선택한 후 **삭제**를 선택합니다.

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

## 다음 단계
<a name="php-laravel-tutorial-nextsteps"></a>

Laravel에 대한 자세한 내용은 [Laravel.com](https://laravel.com/)의 Laravel 공식 웹 사이트를 참조하세요.

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

이 자습서에서는 Elastic Beanstalk 콘솔을 사용하여 Composer 옵션을 구성했습니다. 이 구성이 애플리케이션 원본의 일부가 되도록 만들기 위해 다음 구성 파일을 사용할 수 있습니다.

**Example .ebextensions/composer.config**  

```
option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    document_root: /public
```

자세한 내용은 [구성 파일(`.ebextensions`)을 사용하여 고급 환경 사용자 지정](ebextensions.md)을(를) 참조하세요.

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

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