

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

# 3단계: 사용자 지정 쿡북 생성 및 배포
<a name="other-services-redis-cookbook"></a>

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

현재 상태로는 스택이 아직 제 기능을 발휘할 수 없습니다. 애플리케이션이 Redis 서버에 액세스할 수 있도록 설정해야 합니다. 가장 유연한 방법은 액세스 정보를 포함하는 YAML 파일을 애플리케이션의 `config` 하위 폴더에 배치하는 것입니다. 그러면 애플리케이션이 파일에서 정보를 가져올 수 있습니다. 이 방법을 사용하면 애플리케이션을 재작성 및 재배포하지 않아도 연결 정보를 변경할 수 있습니다. 이 예제에서는 파일의 이름을 `redis.yml`이라고 지정하고, 다음과 같이 ElastiCache 클러스터의 호스트 이름 및 포트를 포함해야 합니다.

```
host: cache-cluster-hostname
port: cache-cluster-port
```

이 파일을 서버에 수동으로 복사할 수 있지만 더 좋은 방법은 Chef *레시피*를 구현하여 파일을 생성하고 OpsWorks Stacks가 모든 서버에서 레시피를 실행하도록 하는 것입니다. Chef 레시피는 OpsWorks Stacks가 패키지 설치 또는 구성 파일 생성과 같은 인스턴스 작업을 수행하는 데 사용하는 특수 Ruby 애플리케이션입니다. 레시피는 여러 레시피와 구성 파일 템플릿 같은 관련 파일을 포함할 수 있는 *쿡북*에 패키징되어 있습니다. 쿡북은 GitHub 같은 리포지토리에 배치되며, 표준 디렉터리 구조를 가져야 합니다. 사용자 지정 쿡북 리포지토리가 없는 경우, [쿡북 리포지토리](workingcookbook-installingcustom-repo.md)에서 설정 방법 단원을 참조하세요.

이 예제에서는 다음 콘텐츠를 포함하는 `redis-config`라는 쿡북을 쿡북 리포지토리에 추가합니다.

```
my_cookbook_repository
  redis-config
    recipes
      generate.rb
    templates
      default
        redis.yml.erb
```

`recipes` 폴더에는 다음과 같이 `generate.rb`로부터 애플리케이션의 구성 파일을 생성하는 레시피 `redis.yml.erb`가 들어 있습니다.

```
node[:deploy].each do |app_name, deploy_config|
  # determine root folder of new app deployment
  app_root = "#{deploy_config[:deploy_to]}/current"

  # use template 'redis.yml.erb' to generate 'config/redis.yml'
  template "#{app_root}/config/redis.yml" do
    source "redis.yml.erb"
    cookbook "redis-config"

    # set mode, group and owner of generated file
    mode "0660"
    group deploy_config[:group]
    owner deploy_config[:user]

    # define variable “@redis” to be used in the ERB template
    variables(
      :redis => deploy_config[:redis] || {}
    )

    # only generate a file if there is Redis configuration
    not_if do
      deploy_config[:redis].blank?
    end
  end
end
```

레시피는 각 인스턴스에 설치되고 스택 및 배포된 앱에 대한 자세한 정보를 포함하는 OpsWorks Stacks 스택 구성 및 배포 JSON 객체의 데이터에 따라 달라집니다. [스택 구성 및 배포 속성](workingcookbook-json.md) 이 객체의 `deploy` 노드는 다음과 같은 구조입니다.

```
{
   ...
  "deploy": {
    "app1": {
      "application" : "short_name",
      ...
    }
    "app2": {
      ...
    }
    ...
  }
}
```

배포 노드에는 배포된 각 앱마다 앱의 짧은 이름으로 명명된 포함된 JSON 객체 세트가 포함됩니다. 각각의 앱 객체에는 문서 루트와 애플리케이션 유형 같은 앱의 구성을 정의하는 속성 세트가 포함됩니다. 배포 속성의 목록은 [deploy 속성](attributes-json-deploy.md) 단원을 참조하세요. 레시피는 Chef 속성 구문을 사용하여 스택 구성 및 배포 JSON 값을 나타낼 수 있습니다. 예를 들어 `[:deploy][:app1][:application]`은 app1 애플리케이션의 짧은 이름을 나타냅니다.

`[:deploy]` 내 각 앱에 대해 레시피가 연결된 코드 블록을 실행합니다. 여기서 `deploy_config`는 앱 속성을 나타냅니다. 먼저 레시피는 `app_root`를 앱의 루트 디렉터리 `[:deploy][:app_name][:deploy_to]/current`로 설정합니다. 그런 다음 Chef [템플릿 리소스](https://docs.chef.io/chef/resources.html#template)를 사용하여 `redis.yml.erb`로부터 구성 파일을 생성하고 `app_root/config`에 저장합니다.

 구성 파일은 일반적으로 템플릿으로부터 생성되며, 이 경우 설정이 대부분 Chef *속성*에 의해 정의됩니다. 속성의 경우, 나중에 설명하듯이 템플릿 파일을 재작성하지 않고 사용자 지정 JSON을 사용하여 설정을 변경할 수 있습니다. `redis.yml.erb` 템플릿에는 다음 항목이 포함됩니다.

```
host: <%= @redis[:host] %>
port: <%= @redis[:port] || 6379 %>
```

<%... %> 요소는 속성 값을 나타내는 자리 표시자입니다.
+ `<%= @redis[:host] %>`는 캐시 클러스터의 호스트 이름을 나타내는 `redis[:host]`의 값입니다.
+ `<%= @redis[:port] || 6379 %>`는 `redis[:port]`의 값을 나타내며, 해당 속성이 정의되지 않은 경우에는 기본 포트 값 6379입니다.

`template` 리소스는 다음과 같이 작동합니다.
+ `source` 및 `cookbook`은 각각 템플릿 이름과 쿡북 이름을 지정합니다.
+ `mode`, `group` 및 `owner`는 구성 파일에 애플리케이션과 동일한 액세스 권한을 부여합니다.
+ `variables` 섹션은 템플릿에 사용되는 `@redis` 변수를 애플리케이션의 `[:redis]` 속성 값으로 설정합니다.

  `[:redis]` 속성의 값은 나중에 설명하듯이 사용자 지정 JSON을 사용하여 설정됩니다. 이 속성은 표준 앱 속성이 아닙니다.
+ `not_if` 명령은 레시피가 이미 존재하는 구성 파일은 생성하지 않게 해줍니다.

쿡북을 작성한 후에는 각 인스턴스의 쿡북 캐시로 배포해야 합니다. 이 작업은 레시피는 실행하지 않고 새 쿡북을 스택의 인스턴스에 설치하기만 합니다. 일반적으로 레시피는 나중에 설명하듯이 계층의 수명 주기 이벤트에 할당하여 실행합니다.

**사용자 지정 쿡북을 배포하려면**

1.  OpsWorks 스택 **스택** 페이지에서 **스택 설정을** 클릭한 다음 **편집**을 클릭합니다.

1. [**구성 관리**] 섹션에서 [**사용자 지정 Chef 쿡북 사용**]을 [**예**]로 설정하고, 쿡북 리포지토리 정보를 입력한 다음 [**저장**]을 클릭하여 스택 구성을 업데이트합니다.  
![\[Configuration form for custom Chef cookbooks with repository details and options.\]](http://docs.aws.amazon.com/ko_kr/opsworks/latest/userguide/images/redis_walkthrough_cookbook.png)

1. [**스택**] 페이지에서 [**명령 실행**]을 클릭하고 [**사용자 지정 쿡북 업데이트**] 스택 명령을 선택한 다음 [**사용자 지정 쿡북 업데이트**]를 클릭하여 인스턴스의 쿡북 캐시에 새 쿡북을 설치합니다.  
![\[Run Command interface showing Update Custom Cookbooks option and instance selection for Rails App Server.\]](http://docs.aws.amazon.com/ko_kr/opsworks/latest/userguide/images/redis_walkthrough_command.png)

쿡북을 수정한 경우 [**사용자 지정 쿡북 업데이트**]를 다시 실행하면 업데이트된 버전이 설치됩니다. 이 절차에 대한 자세한 정보는 [사용자 지정 쿡북 설치](workingcookbook-installingcustom-enable.md) 단원을 참조하세요.