

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

# Linux 인스턴스에서 외부 쿡북 사용: Berkshelf
<a name="cookbooks-101-opsworks-berkshelf"></a>

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

**참고**  
Berkshelf는 Chef 11.10 Linux 스택에서만 사용할 수 있습니다.

쿡북을 구현하기 전에 Chef 커뮤니티의 구성원들이 매우 다양한 용도를 위해 생성한 쿡북이 포함되어 있는 [Chef 커뮤니티 쿡북](https://github.com/opscode-cookbooks)을 확인하세요. 이러한 쿡북은 대부분 수정 없이 OpsWorks Stacks에서 사용할 수 있으므로 모든 코드를 직접 구현하는 대신 일부 작업에 활용할 수 있습니다.

인스턴스에서 외부 쿡북을 사용하려면 쿡북을 설치하고 종속성을 관리할 방법이 필요합니다. 선호되는 방법은 Berkshelf라는 종속성 관리자를 지원하는 쿡북을 구현하는 것입니다. Berkshelf는 OpsWorks Stacks 인스턴스를 포함한 Amazon EC2 인스턴스에서 작동하지만 Test Kitchen 및 Vagrant와 함께 작동하도록 설계되었습니다. 그러나 Vagrant의 사용량은 OpsWorks Stacks와 약간 다르므로이 주제에는 두 플랫폼에 대한 예제가 포함되어 있습니다. Berkshelf를 사용하는 방법에 대한 자세한 정보는 [Berkshelf](http://berkshelf.com/)를 참조하세요.

**Topics**
+ [Test Kitchen 및 Vagrant에서 Berkshelf 사용](#cookbooks-101-opsworks-berkshelf-vagrant)
+ [OpsWorks Stacks에서 Berkshelf 사용](#opsworks-berkshelf-opsworks)

## Test Kitchen 및 Vagrant에서 Berkshelf 사용
<a name="cookbooks-101-opsworks-berkshelf-vagrant"></a>

 이 예제는 Berkshelf를 사용하여 시작하기 커뮤니티 쿡북을 설치하고 해당 레시피를 실행하는 방법을 보여줍니다. 이 레시피는 인스턴스의 홈 디렉터리에 간단한 텍스트 파일을 설치합니다.

**Berkshelf를 설치하고 쿡북을 초기화하려면**

1. 워크스테이션에 다음과 같이 Berkshelf Gem을 설치합니다.

   ```
   gem install berkshelf
   ```

   워크스테이션에 따라 이 명령에는 `sudo`가 필요할 수 있습니다. 또는 Ruby 환경 관리자(예: [RVM](https://rvm.io/))를 사용할 수도 있습니다. Berkshelf가 성공적으로 설치되었는지 확인하려면 `berks --version`을 실행합니다.

1. 이 주제의 쿡북 이름은 external\$1cookbook입니다. 이전 주제에서 채택한 수동 접근 방식 대신 Berkshelf를 사용하여 초기화된 쿡북을 생성할 수 있습니다. 이렇게 하려면 `opsworks_cookbooks` 디렉터리로 이동하여 다음 명령을 실행합니다.

   ```
   berks cookbook external_cookbook
   ```

   이 명령은 `external_cookbook` 디렉터리와 `recipes` 및 `test`를 비롯하여 Chef 및 Test Kitchen 하위 디렉터리를 만듭니다. 또한 이 명령은 다음을 비롯하여 여러 표준 파일의 기본 버전을 생성합니다.
   + `metadata.rb`
   + Vagrant, Test Kitchen 및 Berkshelf용 구성 파일
   + `default.rb` 디렉터리의 빈 `recipes` 레시피
**참고**  
`kitchen init`를 실행할 필요가 없습니다. `berks cookbook` 명령이 이러한 작업을 처리하기 때문입니다.

1. `kitchen converge`를 실행합니다. 새로 생성된 쿡북은 이 시점에서 어떠한 의미 있는 작업을 수행하지 않지만 수렴을 수행합니다.

**참고**  
또한 `berks init`를 사용하여 Berkshelf를 사용하도록 기존 쿡북을 초기화할 수도 있습니다.

Berkshelf를 사용하여 쿡북의 외부 종속성을 관리하려면 쿡북의 루트 디렉터리에 Berkshelf가 종속성을 관리하는 방법을 지정하는 구성 파일인 `Berksfile`이 포함되어야 합니다. `berks cookbook`을 사용하여 `external_cookbook` 쿡북을 생성한 경우 다음 콘텐츠를 포함하는 `Berksfile`이 생성되었습니다.

```
source "https://supermarket.chef.io"
metadata
```

이 파일에는 다음 선언이 포함됩니다.
+ `source` – 쿡북 소스의 URL.

  Berksfile에는 각각 종속 쿡북의 기본 소스를 지정하는 `source` 선언이 여러 개 포함될 수 있습니다. 쿡북의 소스를 명시적으로 지정하지 않을 경우 Berkshelf는 기본 리포지토리에서 동일한 이름의 쿡북을 찾습니다. 기본 Berksfile에는 커뮤니티 쿡북 리포지토리를 지정하는 `source` 속성이 포함됩니다. 이 리포지토리에 시작하기 쿡북이 들어 있습니다. 따라서 이 줄은 그대로 둘 수 있습니다.
+ `metadata` - Berkshelf에게 쿡북의 `metadata.rb` 파일에서 선언된 쿡북 종속성을 포함하도록 지시합니다.

  나중에 설명하듯이 `cookbook` 속성을 포함시켜 Berksfile에서 종속 쿡북을 선언할 수도 있습니다.

쿡북 종속성을 선언하는 방법은 두 가지입니다.
+ Berksfile에 `cookbook` 선언을 포함.

  이는 OpsWorks Stacks에서 사용하는 접근 방식입니다. 예를 들어 이 예제에서 사용되는 시작하기 쿡북을 지정하려면 Berksfile에 `cookbook "getting-started"`를 포함시킵니다. 그러면 Berkshelf가 기본 리포지토리에서 동일한 이름의 쿡북을 찾습니다. 또한 `cookbook`을 사용하여 쿡북 소스는 물론 특정 버전까지 명시적으로 지정할 수도 있습니다. 자세한 정보는 [Berkshelf](http://berkshelf.com/)를 참조하세요.
+ Berksfile에 `metadata` 선언을 포함하고 `metadata.rb`에서 종속성을 선언.

  이 선언은 Berkshelf에게 쿡북의 `metadata.rb` 파일에서 선언된 쿡북 종속성을 포함하도록 지시합니다. 예를 들어 시작하기 종속성을 선언하려면 `depends 'getting-started'` 선언을 쿡북의 `metadata.rb` 파일에 추가합니다.

이 예제에서는 OpsWorks Stacks와의 일관성을 위해 첫 번째 접근 방식을 사용합니다.

**getting-started 쿡북을 설치하려면**

1. 기본 Berksfile을 편집하여 `metadata` 선언을 `getting-started`에 대한 `cookbook` 선언으로 바꿉니다. 내용은 다음과 같아야 합니다.

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

1. 커뮤니티 쿡북 리포지토리에서 워크스테이션의 Berkshelf 디렉터리(일반적으로 `~/.berkshelf`)로 getting-started 쿡북을 다운로드하는 `berks install`을 실행합니다. 일반적으로 이 디렉터리는 *the Berkshelf*라고 합니다. Berkshelf의 `cookbooks` 디렉터리를 살펴보면 getting-started 쿡북의 디렉터리가 있어야 하고 이 디렉터리의 이름은 `getting-started-0.4.0`과 유사합니다.

1. `external_cookbook::default` 실행 목록의 `.kitchen.yml`를 `getting-started::default`로 바꿉니다. 이 예제는 external\$1cookbook의 레시피를 실행하지 않고 기본적으로 getting-started 쿡북을 사용하는 방식입니다. `.kitchen.yml` 파일은 이제 다음과 유사해야 합니다.

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
   
   platforms:
     - name: ubuntu-12.04
   
   suites:
     - name: default
       run_list:
         - recipe[getting-started::default]
       attributes:
   ```

1. `kitchen converge`를 실행한 다음 `kitchen login`을 사용하여 인스턴스에 로그인합니다. 로그인 디렉터리에는 내용이 다음과 같은 `chef-getting-started.txt` 파일이 포함되어 있어야 합니다.

   ```
   Welcome to Chef!
   
   This is Chef version 11.12.8.
   Running on ubuntu.
   Version 12.04.
   ```

   Test Kitchen은 인스턴스의 `/tmp/kitchen/cookbooks` 디렉터리에 쿡북을 설치합니다. 이 디렉터리의 내용을 나열하면 external\$1cookbook 및 getting-started, 이렇게 2개의 쿡북이 있습니다.

1. `kitchen destroy`를 실행하여 인스턴스를 종료합니다. 다음 예제에서는 OpsWorks Stacks 인스턴스를 사용합니다.

## OpsWorks Stacks에서 Berkshelf 사용
<a name="opsworks-berkshelf-opsworks"></a>

OpsWorks Stacks는 선택적으로 Chef 11.10 스택용 Berkshelf를 지원합니다. 스택에서 Berkshelf를 사용하려면 다음을 수행해야 합니다.
+ 스택에서 Berkshelf를 활성화합니다.

  OpsWorks 그런 다음 Stacks는 스택의 인스턴스에 Berkshelf를 설치하는 세부 정보를 처리합니다.
+ Berksfile을 리포지토리의 루트 디렉터리에 추가합니다.

  Berksfile은 모든 종속 쿡북에 대해 `source` 및 `cookbook` 선언을 포함해야 합니다.

Stacks는 인스턴스에 사용자 지정 쿡북 OpsWorks 리포지토리를 설치할 때 Berkshelf를 사용하여 리포지토리의 Berksfile에 선언된 종속 쿡북을 설치합니다. 자세한 내용은 [Berkshelf 사용](workingcookbook-chef11-10.md#workingcookbook-chef11-10-berkshelf) 단원을 참조하십시오.

이 예제에서는 Berkshelf를 사용하여 Stacks 인스턴스에 시작하기 커뮤니티 OpsWorks 쿡북을 설치하는 방법을 보여줍니다. 또한 지정된 디렉터리에 파일을 생성하는 createfile 사용자 지정 쿡북도 설치합니다. createfile 파일이 작동하는 방식에 대한 자세한 정보는 [쿡북에서 파일 설치](cookbooks-101-basics-files.md#cookbooks-101-basics-files-cookbook_file) 단원을 참조하세요.

**참고**  
Stacks 스택에 사용자 지정 OpsWorks 쿡북을 처음 설치한 경우 먼저 [Linux 인스턴스에서 레시피 실행](cookbooks-101-opsworks-opsworks-instance.md) 예제를 살펴봐야 합니다.

다음에 요약된 대로 스택을 생성하여 시작합니다. 자세한 내용은 [새 스택 생성](workingstacks-creating.md) 섹션을 참조하세요.

**스택을 만듭니다**

1. [OpsWorks Stacks 콘솔](https://console.aws.amazon.com/opsworks/)을 열고 **스택 추가**를 클릭합니다.

1. 다음 설정을 지정하고, 그 외 설정에 대해서는 기본값을 수락한 다음 [**스택 추가**]를 클릭합니다.
   + **이름** – BerksTest
   + **기본 SSH 키** – Amazon EC2 키 페어

   Amazon EC2 키 페어를 생성해야 하는 경우 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요. 키 페어는 인스턴스와 동일한 AWS 리전에 속해야 합니다. 이 예에서는 기본 미국 서부(오레곤) 리전을 사용합니다.

1. [**계층 추가**]를 클릭하여 스택에 다음 설정으로 [사용자 지정 계층을 추가](workinglayers-custom.md)합니다.
   + **이름** – BerksTest
   + **짧은 이름** - berkstest

   이 예제에는 실제로 모든 계층 유형을 사용할 수 있습니다. 그러나 이 예제에서는 다른 계층에서 설치한 패키지가 필요하지 않기 때문에 사용자 지정 계층을 사용하는 것이 가장 간단합니다.

1. 기본 설정을 사용하여 BerksTest 계층에 [24/7 인스턴스를 추가](workinginstances-add.md)하되 해당 인스턴스를 아직 시작하지는 마십시오.

Stacks에서는 OpsWorks 쿡북이 표준 디렉터리 구조의 원격 리포지토리에 있어야 합니다. 그런 다음 Stacks에 다운로드 정보를 제공합니다. 그러면 시작 시 OpsWorks 스택의 각 인스턴스에 리포지토리가 자동으로 다운로드됩니다. 간소화를 위해이 예제의 OpsWorks 리포지토리는 퍼블릭 Amazon S3 아카이브이지만 Stacks는 HTTP 아카이브, Git 리포지토리 및 하위 버전 리포지토리도 지원합니다. 자세한 내용은 [쿡북 리포지토리](workingcookbook-installingcustom-repo.md) 단원을 참조하십시오.

Amazon S3 버킷에 전달한 콘텐츠에는 고객 콘텐츠가 포함될 수 있습니다. 중요 데이터 제거에 관한 자세한 내용은 [S3 버킷을 비우려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html) 단원 또는 [S3 버킷을 삭제하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html) 단원을 참조하세요.

**쿡북 리포지토리를 생성하려면**

1. `opsworks_cookbooks` 디렉터리에서 `berkstest_cookbooks`라는 디렉터리를 만듭니다. 이 디렉터리는 리포지토리에 업로드할 것이므로 원하는 경우 편리한 위치면 어디에든 이 디렉터리를 만들 수 있습니다.

1. 다음 내용이 포함된 Berksfile이라는 파일을 `berkstest_cookbooks`에 추가합니다.

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

   이 파일은 getting-started 쿡북 종속성을 선언하고 Berkshelf에 커뮤니티 쿡북 사이트에서 종속성을 다운로드하도록 지시합니다.

1. `createfile` 디렉터리를 다음 항목이 포함된 `berkstest_cookbooks`에 추가합니다.
   + 다음 내용이 포함된 `metadata.rb` 파일

     ```
     name "createfile"
     version "0.1.0"
     ```
   + 다음 내용이 들어 있는 `files/default` 파일이 포함된 `example_data.json` 디렉터리

     ```
     {
       "my_name" : "myname",
       "your_name" : "yourname",
       "a_number" : 42,
       "a_boolean" : true
     }
     ```

     파일의 이름 및 내용은 임의적입니다. 이 레시피는 지정된 위치에 파일을 복사하기만 합니다.
   + 다음 레시피 코드가 들어 있는 `recipes` 파일이 포함된 `default.rb` 디렉터리

     ```
     directory "/srv/www/shared" do
       mode 0755
       owner 'root'
       group 'root'
       recursive true
       action :create
     end
     
     cookbook_file "/srv/www/shared/example_data.json" do
       source "example_data.json"
       mode 0644
       action :create_if_missing
     end
     ```

     이 레시피는 `/srv/www/shared`를 만들고, 쿡북의 `files` 디렉터리에서 이 디렉터리로 `example_data.json`을 복사합니다.

1. `berkstest_cookbooks`의 `.zip` 아카이브를 생성하고, [이 아카이브를 Amazon S3 버킷에 업로드](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html)한 다음, [해당 아카이브를 퍼블릭으로 설정](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)하고, 아카이브의 URL을 기록합니다.

이제 쿡북을 설치하고 레시피를 실행할 수 있습니다.

**쿡북을 설치하고 레시피를 실행하려면**

1. [스택을 편집해 사용자 지정 쿡북을 활성화](workingcookbook-installingcustom-enable.md)하고 다음 설정을 지정합니다.
   + **리포지토리 유형** – **Http Archive**
   + **리포지토리 URL** - 앞에서 기록해 둔 쿡북 아카이브 URL
   + **Berkshelf 관리** – **예**

   처음 두 설정은 OpsWorks Stacks에 쿡북 리포지토리를 인스턴스에 다운로드하는 데 필요한 정보를 제공합니다. 마지막 설정은 인스턴스로 getting-started 쿡북을 다운로드하는 Berkshelf 지원을 활성화합니다. 기타 설정에 대해 기본값을 수락하고 [**저장**]을 클릭하여 스택 구성을 업데이트합니다.

1. BerksTest 계층을 편집하여 [다음 레시피를 계층의 설정 수명 주기 이벤트에 추가](workingcookbook-assigningcustom.md)합니다.
   + `getting-started::default`
   + `createfile::default`

1. 인스턴스를 [시작](workinginstances-starting.md)합니다. Setup 이벤트는 인스턴스 부팅이 완료된 후에 발생합니다. 그런 다음 OpsWorks Stacks는 쿡북 리포지토리를 설치하고, Berkshelf를 사용하여 시작하기 쿡북을 다운로드하고, `getting-started::default` 및를 포함한 계층의 설정 및 배포 레시피를 실행합니다`createfile::default`.

1. 인스턴스가 온라인 상태가 되면 [SSH를 사용하여 로그인합니다](workinginstances-ssh.md). 다음과 같은 모양이어야 합니다.
   + `/srv/www/shared`에는 `example_data.json`이 포함되어 있어야 합니다.
   + `/root`에는 `chef-getting-started.txt`이 포함되어 있어야 합니다.

     OpsWorks Stacks는 레시피를 루트로 실행하므로 시작하기를 통해 홈 `/root` 디렉터리가 아닌 디렉터리에 파일이 설치됩니다.