

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

# Elastic Beanstalk에 Rails 애플리케이션 배포
<a name="ruby-rails-tutorial"></a>

Rails는 Ruby용 오픈 소스 MVC(모델-보기-컨트롤러) 프레임워크입니다. 이 자습서에서는 Rails 애플리케이션을 생성하고 AWS Elastic Beanstalk 환경에 배포하는 프로세스를 안내합니다.

**Topics**
+ [사전 조건](#ruby-rails-tutorial-prereqs)
+ [Elastic Beanstalk에 대한 기본 지식](#ruby-rails-tutorial-prereqs-basic)
+ [Elastic Beanstalk 환경 시작](#ruby-rails-tutorial-launch)
+ [Rails 설치 및 웹 사이트 생성](#ruby-rails-tutorial-generate)
+ [Rails 설정 구성](#ruby-rails-tutorial-configure)
+ [애플리케이션 배포](#ruby-rails-tutorial-deploy)
+ [정리](#ruby-rails-tutorial-cleanup)
+ [다음 단계](#ruby-rails-tutorial-nextsteps)

## 사전 조건
<a name="ruby-rails-tutorial-prereqs"></a>

## Elastic Beanstalk에 대한 기본 지식
<a name="ruby-rails-tutorial-prereqs-basic"></a>

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

### 명령줄
<a name="ruby-rails-tutorial-prereqs-cmdline"></a>

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

```
~/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 통합 버전을 가져옵니다.

### Rails 종속성
<a name="ruby-rails-tutorial-prereqs-railsreqs"></a>

Rails 프레임워크 6.1.4.1에는 다음 종속 항목이 있습니다. 모두 설치해야 합니다.
+ **Ruby 2.5.0 이상** - 설치 지침은 [Elastic Beanstalk를 위한 Ruby 개발 환경 설정](ruby-development-environment.md) 단원을 참조하세요.

  이 자습서에서는 Ruby 3.0.2 및 해당 Elastic Beanstalk 플랫폼 버전을 사용합니다.
+ **Node.js** - 설치 지침은 [패키지 관리자를 통해 Node.js 설치](https://nodejs.org/en/download/package-manager/)를 참조하세요.
+ **Yarn** - 설치 지침은 *Yarn* 웹사이트의 [설치](https://yarnpkg.com/lang/en/docs/install/)를 참조하세요.

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

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

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

1. 미리 구성된 다음 링크를 사용하여 Elastic Beanstalk 콘솔을 엽니다. [console.aws.amazon.com/elasticbeanstalk/home\$1/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)을(를) 참조하세요.

## Rails 설치 및 웹 사이트 생성
<a name="ruby-rails-tutorial-generate"></a>

`gem` 명령을 사용하여 Rails와 해당 종속성을 설치합니다.

```
~$ gem install rails
Fetching: concurrent-ruby-1.1.9.gem
Successfully installed concurrent-ruby-1.1.9
Fetching: rack-2.2.3.gem
Successfully installed rack-2.2.3
...
```

Rails 설치를 테스트합니다.

```
~$ rails --version
Rails 6.1.4.1
```

애플리케이션 이름이 포함된 `rails new`를 사용하여 새 Rails 프로젝트를 만듭니다.

```
~$ rails new ~/eb-rails
```

Rails는 이름을 지정하여 디렉터리를 만들고, 로컬에서 샘플 프로젝트를 실행할 때 필요한 모든 파일을 생성한 후, bundler를 실행하여 프로젝트의 Gemfile에 정의된 모든 종속 항목(Gems)을 설치합니다.

**참고**  
이 프로세스는 프로젝트에 대한 최신 Puma 버전을 설치합니다. 이 버전은 사용자 환경의 Ruby 플랫폼 버전에서 Elastic Beanstalk가 제공하는 버전과 다를 수 있습니다. Elastic Beanstalk에서 제공되는 Puma 버전을 보려면 *AWS Elastic Beanstalk 플랫폼 가이드*의 [Ruby 플랫폼 이력](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platform-history-ruby.html)을 참조하세요. 최신 Puma 버전에 대한 자세한 내용은 [Puma.io](http://puma.io) 웹 사이트를 참조하세요. 두 Puma 버전 간에 불일치가 있는 경우 다음 옵션 중 하나를 사용하세요.  
이전 `rails new` 명령으로 설치된 Puma 버전을 사용하세요. 이 경우 자체 제공한 Puma 서버 버전을 사용하려면 플랫폼에 대해 `Procfile`을(를) 추가해야 합니다. 자세한 내용은 [Elastic Beanstalk에서 Procfile을 사용하여 애플리케이션 프로세스 구성.](ruby-platform-procfile.md) 단원을 참조하십시오.
사용자 환경의 Ruby 플랫폼 버전에 사전 설치된 버전과 일치하도록 Puma 버전을 업데이트합니다. 이를 위해서는 프로젝트 소스 디렉터리의 루트에 있는 [Gemfile](ruby-platform-gemfile.md#ruby-platform-gemfile.title)의 Puma 버전을 수정해야 합니다. 그런 다음 `bundle update`을(를) 실행합니다. 자세한 내용은 Bundler.io 웹 사이트의 [번들 업데이트](https://bundler.io/man/bundle-update.1.html) 페이지를 참조하세요.

로컬에서 기본 프로젝트를 실행하여 Rails 설치를 테스트합니다.

```
~$ cd eb-rails
~/eb-rails$ rails server
=> Booting Puma
=> Rails 6.1.4.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.5.2 (ruby 3.0.2-p107) ("Zawgyi")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 77857
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
...
```

웹 브라우저에서 `http://localhost:3000`을 열고 실행 중인 기본 프로젝트를 확인합니다.

![\[기본 Rails 사이트 개발 페이지입니다.\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/ruby-rails-default.png)


이 페이지는 개발 모드에서만 표시됩니다. Elastic Beanstalk에 대한 운영 배포를 지원하기 위해 애플리케이션의 프런트 페이지에 일부 콘텐츠를 추가합니다. `rails generate`를 사용하여 컨트롤러를 만들고 라우팅한 후 시작 페이지를 확인합니다.

```
~/eb-rails$ rails generate controller WelcomePage welcome
      create  app/controllers/welcome_page_controller.rb
       route  get 'welcome_page/welcome'
      invoke  erb
      create    app/views/welcome_page
      create    app/views/welcome_page/welcome.html.erb
      invoke  test_unit
      create    test/controllers/welcome_page_controller_test.rb
      invoke  helper
      create    app/helpers/welcome_page_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/welcome_page.coffee
      invoke    scss
      create      app/assets/stylesheets/welcome_page.scss.
```

이는 `/welcome_page/welcome`의 페이지에 액세스하는 데 필요한 모든 정보를 제공합니다. 그러나 변경 내용을 게시하기 전에, 보기에서 콘텐츠를 바꾸고 이 페이지가 사이트의 최상위에 표시되도록 경로를 추가해야 합니다.

텍스트 편집기를 사용하여 `app/views/welcome_page/welcome.html.erb`에서 콘텐츠를 편집합니다. 이 예에서는 `cat`을 사용하여 기존 파일의 콘텐츠를 덮어씁니다.

**Example app/views/welcome\$1page/welcome.html.erb**  

```
<h1>Welcome!</h1>
<p>This is the front page of my first Rails application on Elastic Beanstalk.</p>
```

 마지막으로 다음 경로를 `config/routes.rb`에 추가합니다.

**Example config/routes.rb**  

```
Rails.application.routes.draw do
  get 'welcome_page/welcome'
  root 'welcome_page#welcome'
```

그러면 웹 사이트 루트에 대한 요청을 시작 페이지 컨트롤러의 시작 메서드로 라우팅하라고 Rails에 지시하게 되며, 이를 통해 시작 보기(`welcome.html.erb`)의 콘텐츠를 렌더링합니다.

Elastic Beanstalk가 Ruby 플랫폼에서 애플리케이션을 성공적으로 배포하기 위해서는 `Gemfile.lock`의 업데이트가 필요합니다. `Gemfile.lock `에 대한 일부 종속성은 플랫폼별로 다를 수 있습니다. 따라서 필요한 모든 종속성이 배포와 함께 설치되도록 **platform ruby**를 `Gemfile.lock`에 추가해야 합니다.

**Example**  

```
~/eb-rails$ bundle lock --add-platform ruby
Fetching gem metadata from https://rubygems.org/............
Resolving dependencies...
Writing lockfile to /Users/janedoe/EBDPT/RubyApps/eb-rails-doc-app/Gemfile.lock
```

## Rails 설정 구성
<a name="ruby-rails-tutorial-configure"></a>

Elastic Beanstalk 콘솔을 사용하여 환경 속성으로 Rails를 구성합니다. `SECRET_KEY_BASE` 환경 속성을 최대 256자의 영숫자 문자열로 설정합니다.

Rails는 이 속성을 사용하여 키를 생성합니다. 따라서 이 속성을 보안 유지해야 하며 소스 제어에 일반 텍스트로 저장하지 않아야 합니다. 대신 환경 속성을 통해 사용자 환경의 Rails 코드에 이 속성을 제공합니다.

**Elastic Beanstalk 콘솔에서 환경 변수를 구성하는 방법**

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

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

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

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

1. 아래로 스크롤하여 **런타임 환경 변수**를 찾습니다.

1. **환경 변수 추가**를 선택합니다.

1. **소스**에서 **일반 텍스트**를 선택합니다.
**참고**  
드롭다운에 표시되는 **Secrets Manager** 및 **SSM 파라미터 스토어** 값은 자격 증명이나 API 키와 같은 민감한 데이터를 저장하기 위해 환경 변수를 보안 암호로 구성할 때 사용됩니다. 자세한 내용은 [AWS Secrets Manager 및 AWS Systems Manager 파라미터 스토어와 함께 Elastic Beanstalk 사용](AWSHowTo.secrets.md) 단원을 참조하십시오.

1. **환경 변수 이름**과 **환경 변수 값** 페어를 입력하세요.

1. 환경 변수 페어를 더 추가하려면 **6단계**부터 **8단계**까지 반복하세요.

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

이제 환경에 사이트를 배포할 준비가 되었습니다.

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

Rails가 생성한 파일이 포함된 [소스 번들](applications-sourcebundle.md)을 만듭니다. 다음 명령은 `rails-default.zip`이라는 이름의 소스 번들을 생성합니다.

```
~/eb-rails$ zip ../rails-default.zip -r * .[^.]*
```

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

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

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

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

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

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

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

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

## 정리
<a name="ruby-rails-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. 화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.

## 다음 단계
<a name="ruby-rails-tutorial-nextsteps"></a>

Rails에 대한 자세한 내용은 [rubyonrails.org](https://rubyonrails.org/)를 참조하십시오.

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

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