

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

# 예제 9: Amazon EC2 인스턴스 사용
<a name="cookbooks-101-basics-ec2"></a>

**중요**  
이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 서비스 수명이 종료되었으며 신규 및 기존 고객 모두에서 비활성화되었습니다. 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션하는 것이 좋습니다. 마이그레이션에 대한 질문이 있는 경우 [AWS re:Post](https://repost.aws/) 또는 [AWS Premium Support](https://aws.amazon.com/support)를 통해 AWS Support 팀에 문의하세요.

지금까지는 VirtualBox에서 로컬로 인스턴스를 실행했습니다. 이 방법이 빠르고 쉽기는 하지만 결국은 Amazon EC2 인스턴스에서 레시피를 테스트해야 합니다. 특히 Amazon Linux에서 레시피를 실행하려면 Amazon EC2에서만 가능합니다. 예비 구현 및 테스트를 위해 CentOS 같은 비슷한 시스템을 사용할 수 있지만 Amazon Linux에서 레시피를 완전히 테스트하는 유일한 방법은 Amazon EC2 인스턴스를 사용하는 것입니다.

이 주제에서는 Amazon EC2 인스턴스에서 레시피를 실행하는 방법을 살펴봅니다. 다음 두 가지 차이점만 제외하고 Test Kitchen과 Vagrant도 앞 섹션과 거의 같은 방법으로 사용합니다.
+ 드라이버가 Vagrant 대신 [https://rubygems.org/gems/kitchen-ec2](https://rubygems.org/gems/kitchen-ec2)입니다.
+ Amazon EC2 인스턴스를 시작하는 데 필요한 정보를 사용하여 쿡북의 `.kitchen.yml` 파일을 구성해야 합니다.

**참고**  
대안적 방법은 `vagrant-aws` Vagrant 플러그인을 사용하는 것입니다. 자세한 정보는 [Vagrant AWS 공급자](https://github.com/mitchellh/vagrant-aws)를 참조하세요.

Amazon EC2 인스턴스를 생성하려면 AWS 자격 증명이 필요합니다. AWS 계정이 없는 경우, 다음과 같이 계정을 얻을 수 있습니다.

## 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

## 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS 로그인 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com/singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS 로그인 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)를 참조하세요.

Amazon EC2에 액세스할 수 있는 권한이 있는 [IAM 사용자를 생성하고](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) 사용자의 액세스 및 보안 키를 워크스테이션의 안전한 위치에 저장해야 합니다. Test Kitchen은 이 자격 증명을 사용하여 인스턴스를 생성합니다. Test Kitchen에 자격 증명을 제공하는 선호되는 방법은 워크스테이션에서 다음 환경 변수에 키를 할당하는 것입니다.

**주의**  
IAM 사용자는 장기 자격 증명을 가지므로 보안 위험이 있습니다. 이 위험을 줄이려면 이러한 사용자에게 작업을 수행하는 데 필요한 권한만 제공하고 더 이상 필요하지 않을 경우 이러한 사용자를 제거하는 것이 좋습니다.
+ AWS\$1ACCESS\$1KEY - 사용자의 액세스 키로,와 비슷합니다AKIAIOSFODNN7EXAMPLE.
+ AWS\$1SECRET\$1KEY - 사용자의 보안 키로,와 비슷합니다wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY.

이 방법은 예컨대 자격 증명이 포함된 프로젝트를 퍼블릭 리포지토리에 업로드함으로써 뜻하지 않게 계정이 침해될 가능성을 줄입니다.

**쿡북을 설정하려면**

1. `kitchen-ec2` 드라이버를 사용하려면 시스템에 `ruby-dev` 패키지가 설치되어 있어야 합니다. 다음 예제 명령은 `aptitude`를 사용하여 Ubuntu 시스템에 패키지를 설치하는 방법을 보여줍니다.

   ```
   sudo aptitude install ruby1.9.1-dev 
   ```

1. `kitchen-ec2` 드라이버는 다음과 같이 설치할 수 있는 Gem입니다.

   ```
   gem install kitchen-ec2
   ```

   워크스테이션에 따라 이 명령에는 `sudo`가 필요할 수 있습니다. 또는 Ruby 환경 관리자(예: [RVM](https://rvm.io/))를 사용할 수도 있습니다. 이 절차는 `kitchen-ec2` 드라이버 버전 0.8.0에서 테스트했으나 최신 버전이 있습니다. [특정 버전](https://rubygems.org/gems/kitchen-ec2/versions)을 설치하려면 `gem install kitchen-ec2 -v <version number>`를 실행합니다.

1. Test Kitchen이 인스턴스에 연결하는 데 사용할 수 있는 Amazon EC2 SSH 키 페어를 지정해야 합니다. Amazon EC2 키 페어가 없는 경우 이러한 키 페어를 생성하는 방법은 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요. 키 페어는 인스턴스와 동일한 AWS 리전에 속해야 합니다. 이 예에서는 미국 서부(캘리포니아 북부)를 사용합니다.

   키 페어를 선택한 후에는 `opsworks_cookbooks`의 하위 디렉터리로 `ec2_keys`를 만들고 해당 키 페어의 프라이빗 키(`.pem`) 파일을 이 하위 디렉터리에 복사합니다. 프라이빗 키는 시스템의 모든 위치에 저장할 수 있지만 `ec2_keys`에 저장하면 코드가 간소화되어 편리합니다.

1. `createdir-ec2`의 하위 디렉터리 `opsworks_cookbooks`를 만들고 그 디렉터리로 이동합니다.

1. `createdir-ec2`에 다음 콘텐츠가 포함된 `metadata.rb` 파일을 추가합니다.

   ```
   name "createdir-ec2"
   version "0.1.0"
   ```

1. [예제 1: 패키지 설치](cookbooks-101-basics-packages.md) 단원에서 설명하는 대로 Test Kitchen을 초기화합니다. 다음 단원에서는 `.kitchen.yml`을 구성하는 방법에 대해 설명합니다. 이 파일은 Amazon EC2 인스턴스의 경우 훨씬 더 복잡합니다.

1. `recipes` 하위 디렉터리를 `createdir-ec2`에 추가합니다.

## Amazon EC2용 .kitchen.yml 구성
<a name="w2ab1c14c71b9c15c17c31c37"></a>

`kitchen-ec2` 드라이버가 적절히 구성된 Amazon EC2 인스턴스를 시작하는 데 필요한 정보를 사용하여 `.kitchen.yml`을 구성합니다. 다음은 미국 서부(캘리포니아 북부) 리전의 Amazon Linux 인스턴스용 `.kitchen.yml` 파일의 예입니다.

```
driver:
  name: ec2
  aws_ssh_key_id: US-East1
  region: us-west-1
  availability_zone: us-west-1c
  require_chef_omnibus: true
  security_group_ids: sg........
  subnet_id: subnet-.........
  associate_public_ip: true
  interface: dns

provisioner:
  name: chef_solo

platforms:
  -name: amazon
  driver:
    image_id: ami-xxxxxxxx
  transport:
    username: ec2-user
    ssh_key: ../ec2_keys/US-East1.pem

suites:
  - name: default
    run_list:
      - recipe[createdir-ec2::default]
    attributes:
```

`provisioner` 및 `suites` 섹션의 기본 설정을 사용할 수 있지만 기본 `driver` 및 `platforms` 설정을 수정해야 합니다. 이 예제에서는 최소한의 설정 목록을 사용하며 나머지에 대해서는 기본값을 사용합니다. 완전한 `kitchen-ec2` 설정 목록은 [Kitchen::Ec2: Amazon EC2용 Test Kitchen 드라이버](https://github.com/test-kitchen/kitchen-ec2)를 참조하세요.

이 예제는 다음 `driver` 속성을 설정합니다. 이 예제에서는 앞서 설명한 것처럼 사용자의 액세스 키와 보안 키를 표준 환경 변수에 할당했다고 가정합니다. 드라이버는 기본적으로 이러한 키를 사용합니다. 그렇지 않은 경우, `aws_access_key_id`와 `aws_secret_access_key`를 `driver` 속성에 추가하여 명시적으로 키를 지정하고 적절한 키 값으로 설정해야 합니다.

**이름**  
(필수) 이 속성은 `ec2`로 설정해야 합니다.

**aws\$1ssh\$1key\$1id**  
(필수) 이 예제에서 `US-East1`으로 명명된 Amazon EC2 SSH 키 페어 이름.

**transport.ssh\$1key**  
(필수) `aws_ssh_key_id`에 대해 지정한 키의 프라이빗 키(`.pem`) 파일. 이 예제에서 이 파일은 `US-East1.pem`으로 명명되며 `../opsworks/ec2_keys` 디렉터리에 있습니다.

**리전**  
(필수) 인스턴스의 AWS 리전. 이 예에서는) 로 `us-west-1` 표시되는 미국 서부(캘리포니아 북부)를 사용합니다.

**availability\$1zone**  
(선택 사항) 인스턴스의 가용 영역. 이 설정을 생략하면 Test Kitchen은 지정된 리전에 대해 기본 가용 영역(`us-west-1b`의 경우, 미국 서부(캘리포니아 북부))를 사용합니다. 하지만 이 가용 영역은 사용자 계정에서 사용하지 못할 수 있습니다. 이 경우, 가용 영역을 명시적으로 지정해야 합니다. 마침 이 예제를 준비하는 데 사용된 계정이 `us-west-1b`를 지원하지 않기 때문에 예제는 명시적으로 `us-west-1c`를 지정합니다.

**require\$1chef\$1omnibus**  
이 설정을 `true`로 설정하면 omnibus installer를 사용하여 모든 플랫폼 인스턴스에 `chef-client`를 설치합니다.

**security\$1group\$1ids**  
(선택 사항) 인스턴스에 적용할 보안 그룹 ID 목록. 이 설정은 `default` 보안 그룹을 인스턴스에 적용합니다. 보안 그룹 수신 규칙이 인바운드 SSH 연결을 허용하도록 하세요. 그렇지 않으면 Test Kitchen이 인스턴스와 통신할 수 없습니다. `default` 보안 그룹을 사용하는 경우, 그에 맞게 편집해야 할 수 있습니다. 자세한 내용은 [Amazon EC2 보안 그룹](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)을 참조하세요.

**subnet\$1id**  
인스턴스의 대상 서브넷 ID(해당되는 경우).

**associate\$1public\$1ip**  
인터넷에서 인스턴스에 액세스할 수 있도록 Amazon EC2 인스턴스가 해당 인스턴스에 퍼블릭 IP 주소를 연결하도록 할 수 있습니다.

**인터페이스**  
인스턴스에 액세스하는 데 사용하는 호스트 이름 구성 형식. 유효한 값은 `dns`, `public`, `private` 또는 `private_dns`입니다. 이 속성의 값을 지정하지 않으면 `kitchen-ec2`이 다음 순서로 호스트 이름 구성을 설정합니다. 이 속성을 생략하면 구성 형식이 설정되지 않습니다.  

1. DNS 이름

1. 퍼블릭 IP 주소

1. 프라이빗 IP 주소

1. 프라이빗 DNS 이름

**중요**  
액세스 키와 보안 키에 계정 자격 증명을 사용하는 대신 사용자를 생성해 이러한 자격 증명을 Test Kitchen에 제공해야 합니다. 자세한 내용은 [AWS 액세스 키 관리 모범 사례](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html)를 참조하세요.  
`.kitchen.yml`을 공용 액세스가 가능한 위치에 저장하지 않도록 주의하세요(예: 퍼블릭 GitHub 또는 Bitbucket 리포지토리에 업로드). 그러면 자격 증명이 노출되고 계정의 보안이 훼손될 수 있습니다.

`kitchen-ec2` 드라이버는 다음 플랫폼에 대한 기본 지원을 제공합니다.
+ ubuntu-10.04
+ ubuntu-12.04
+ ubuntu-12.10
+ ubuntu-13.04
+ ubuntu-13.10
+ ubuntu-14.04
+ centos-6.4
+ debian-7.1.0
+ windows-2012r2
+ windows-2008r2

이런 플랫폼을 하나 이상 사용하려는 경우, 적절한 플랫폼 이름을 `platforms`에 추가합니다. `kitchen-ec2` 드라이버가 자동으로 적절한 AMI를 선택하고 SSH 사용자 이름을 생성합니다. 다른 플랫폼(이 예에서는 Amazon Linux 사용)을 사용할 수 있지만 다음 `platforms` 속성을 명시적으로 지정해야 합니다. 

**이름**  
플랫폼 이름. 이 예제는 Amazon Linux를 사용하므로 `name`이 `amazon`으로 설정됩니다.

**driver**  
다음을 포함하는 `driver` 속성.  
+ `image_id` – 플랫폼의 AMI로서 지정된 리전에 속해야 합니다. 이 예제는 미국 서부(캘리포니아 북부) 리전의 Amazon Linux AMI인 `ami-ed8e9284`를 사용합니다.
+ `transport.username` – Test Kitchen이 인스턴스와의 통신에 사용할 SSH 사용자 이름.

  Amazon Linux의 경우, `ec2-user`를 사용합니다. 다른 AMI는 사용자 이름이 다를 수 있습니다.

`.kitchen.yml`의 코드를 예제로 바꾸고 `aws_access_key_id`와 같은 계정별 속성에 적절한 값을 할당합니다.

## 레시피 실행
<a name="w2ab1c14c71b9c15c17c31c39"></a>

이 예제는 [반복](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration)의 레시피를 사용합니다.

**레시피를 실행하려면**

1. 다음 코드를 사용하여 `default.rb` 파일을 만들어 이 파일을 쿡북의 `recipes` 폴더에 저장합니다.

   ```
   directory "/srv/www/shared" do
     mode 0755
     owner 'root'
     group 'root'
     recursive true
     action :create
   end
   ```

1. `kitchen converge`를 실행하여 레시피를 실행합니다. Amazon EC2 인스턴스를 시작 및 초기화하는 데 필요한 시간 때문에 이전 예제보다 이 명령을 완료하는 데 더 많은 시간이 걸릴 수 있습니다.

1.  [Amazon EC2 콘솔](https://console.aws.amazon.com/ec2/)로 이동하여 미국 서부(캘리포니아 북부) 리전을 선택하고 탐색 창에서 **인스턴스**를 클릭합니다. 목록에 새로 생성된 인스턴스가 보입니다.

1. VirtualBox에서 실행 중인 인스턴스에 대해 수행한 것처럼 `kitchen login`을 실행하여 인스턴스에 로그인합니다. `/srv`에 새로 생성된 디렉터리가 있습니다. 이제 즐겨 사용하는 SSH 클라이언트를 사용하여 인스턴스에 연결할 수 있습니다.