

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

# 레시피
<a name="workingcookbook-installingcustom-components-recipes"></a>

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

레시피는 시스템 구성을 정의하는 Ruby 애플리케이션입니다. 패키지를 설치하고, 템플릿에서 구성 파일을 생성하고, shell 명령을 실행하고, 파일 및 디렉터리를 생성하는 등의 작업을 수행합니다. 일반적으로 인스턴스에서 [수명 주기 이벤트](workingcookbook-events.md)가 발생할 때 OpsWorks Stacks가 레시피를 자동으로 실행하도록 하지만 [Execute Recipes 스택 명령을](workingcookbook-executing.md) 사용하여 언제든지 명시적으로 실행할 수도 있습니다. 자세한 정보는 [About Recipes](http://docs.chef.io/recipes.html)를 참조하세요.

대개 레시피는 일련의 *리소스*로 구성되는데, 각 리소스는 시스템 특정 측면에 대해 원하는 값을 나타냅니다. 각 리소스는 원하는 상태를 정의하는 속성 세트를 포함하며 수행될 작업을 지정합니다. Chef는 각 리소스를 작업을 수행하는 적절한 *공급자*와 연결합니다. 자세한 정보는 [Resources and Providers Reference](https://docs.chef.io/resource.html)를 참조하세요.

`package` 리소스는 Linux 인스턴스에서 소프트웨어 패키지를 관리하는 데 유용합니다. 다음 예제에서는 Apache 패키지를 설치합니다.

```
...
package 'apache2' do
  case node[:platform]
  when 'centos','redhat','fedora','amazon'
    package_name 'httpd'
  when 'debian','ubuntu'
    package_name 'apache2'
  end
  action :install
end
...
```

Chef는 플랫폼에 적절한 패키지 공급자를 사용합니다. 리소스 속성은 단순히 할당된 값일 경우가 많지만, Ruby 논리 연산을 사용하여 조건 할당도 가능합니다. 예제에서는 `case` 연산자가 사용됩니다. 이 연산자는 `node[:platform]`를 사용하여 인스턴스의 운영 체제를 식별하고 그 결과에 따라 `package_name` 속성을 설정합니다. 표준 Chef 노드 구문을 사용하여 레시피에 속성을 삽입할 수 있으며, Chef가 해당 속성을 연결된 값으로 대체합니다. 쿡북 속성뿐 아니라 노드 객체의 모든 속성을 사용할 수 있습니다.

적절한 패키지 이름을 결정하면 코드 세그먼트가 패키지를 설치하는 `install` 작업으로 끝납니다. 이 리소스에 대한 다른 작업은 `upgrade` 및 `remove`를 포함합니다. 자세한 정보는 [package](https://docs.chef.io/chef/resources.html#id150)를 참조하세요.

복잡한 설치 및 구성 작업을 하나 이상의 하위 작업으로 분할하고 각각 별도의 레시피로 구현한 후 주 레시피가 적절한 시간에 각 레시피를 실행하게 하는 것이 유용할 경우가 많습니다. 다음 예제는 이전 예제에 이어지는 코드입니다.

```
include_recipe 'apache2::service'
```

레시피가 하위 레시피를 실행하도록 하려면 `include_recipe` 키워드와 그 뒤에 레시피 이름을 사용합니다. 레시피는 표준 Chef `CookbookName::RecipeName` 구문을 사용하여 식별됩니다. 여기서 `RecipeName`에는 `.rb` 확장명을 생략합니다.

**참고**  
`include_recipe` 문은 주 레시피에서 해당 지점의 레시피를 효과적으로 실행합니다. 하지만 실제로는 Chef가 각 `include_recipe` 문을 지정된 레시피의 코드로 대체한 후 주 레시피를 실행합니다.

`directory` 리소스는 디렉터리를 나타냅니다(예: 패키지 파일이 저장된 디렉터리). 다음 `default.rb` 리소스는 Linux 로그 디렉터리를 생성합니다.

```
directory node[:apache][:log_dir] do
    mode 0755
    action :create
end
```

로그 디렉터리는 쿡북의 속성 파일 중 하나에서 정의됩니다. 이 리소스는 디렉터리 모드를 0755로 지정하며, `create` 작업을 사용하여 디렉터리를 생성합니다. 자세한 정보는 [directory](https://docs.chef.io/chef/resources.html#directory)를 참조하세요. 이 리소스를 Windows 인스턴스에서도 사용할 수 있습니다.

`execute` 리소스는 명령을 나타냅니다(예: shell 명령 또는 스크립트). 다음 예제는 module.load 파일을 생성합니다.

```
execute 'generate-module-list' do
  if node[:kernel][:machine] == 'x86_64'
    libdir = 'lib64'
  else
    libdir = 'lib'
  end
  command "/usr/local/bin/apache2_module_conf_generate.pl /usr/#{libdir}/httpd/modules /etc/httpd/mods-available"
  action :run
end
```

이 리소스는 먼저 CPU 유형을 식별합니다. `[:kernel][:machine]`은 Chef가 다양한 시스템 속성(이 경우에는 CPU 유형)을 나타내기 위해 생성하는 또 하나의 자동 속성입니다. 그런 다음 명령 Perl 스크립트를 지정하고 `run` 작업을 사용하여 스크립트를 실행합니다. 그러면 module.load 파일이 생성됩니다. 자세한 정보는 [실행](https://docs.chef.io/chef/resources.html#execute)을 참조하세요.

`template` 리소스는 쿡북의 템플릿 파일 중 하나에서 생성되는 파일(일반적으로 구성 파일)을 나타냅니다. 다음 예제는 [템플릿](workingcookbook-installingcustom-components-templates.md) 단원에 설명된 `apache2.conf.erb` 템플릿으로부터 `httpd.conf` 구성 파일을 생성합니다.

```
template 'apache2.conf' do
  case node[:platform]
  when 'centos','redhat','fedora','amazon'
    path "#{node[:apache][:dir]}/conf/httpd.conf"
  when 'debian','ubuntu'
    path "#{node[:apache][:dir]}/apache2.conf"
  end
  source 'apache2.conf.erb'
  owner 'root'
  group 'root'
  mode 0644
  notifies :restart, resources(:service => 'apache2')
end
```

이 리소스는 인스턴스의 운영 체제에 따라 생성된 파일의 이름 및 위치를 결정합니다. 그런 다음 `apache2.conf.erb`를 파일을 생성하는 데 사용할 템플릿으로 지정하고 파일의 소유자, 그룹 및 모드를 설정합니다. 이 리소스는 `notify` 작업을 실행하여 Apache 서버를 나타내는 `service` 리소스에 서버를 재시작하라고 알립니다. 자세한 정보는 [template](https://docs.chef.io/chef/resources.html#template) 단원을 참조하세요.