

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

# 레시피 구조
<a name="cookbooks-101-basics-structure"></a>

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

쿡북은 기본적으로 인스턴스에서 다양한 작업을 수행할 수 있는 *레시피*의 집합입니다. 레시피를 구현하는 방법을 명확히 알려면 간단한 예를 살펴보는 것이 도움이 됩니다. 다음은 내장 [HAProxy 계층](layers-haproxy.md)의 설정 레시피입니다. 지금은 전체적인 구조에 집중하고 세부적인 사항에 너무 신경 쓰지 마십시오. 세부적인 내용은 이후 예제에서 다룹니다.

```
package 'haproxy' do
  action :install
end

if platform?('debian','ubuntu')
  template '/etc/default/haproxy' do
    source 'haproxy-default.erb'
    owner 'root'
    group 'root'
    mode 0644
  end
end

include_recipe 'haproxy::service'

service 'haproxy' do
  action [:enable, :start]
end

template '/etc/haproxy/haproxy.cfg' do
  source 'haproxy.cfg.erb'
  owner 'root'
  group 'root'
  mode 0644
  notifies :restart, "service[haproxy]"
end
```

**참고**  
이 예제 및 다른 작업 레시피와 관련 파일의 예제는 [OpsWorks Stacks 내장 레시피](https://github.com/aws/opsworks-cookbooks)를 참조하세요.

이 예제는 다음 섹션에서 설명하는 주요 레시피 요소를 집중적으로 다룹니다.

**Topics**
+ [리소스](#cookbooks-101-basics-structure-resources)
+ [흐름 제어](#cookbooks-101-basics-structure-ruby)
+ [포함된 레시피](#cookbooks-101-basics-structure-include)

## 리소스
<a name="cookbooks-101-basics-structure-resources"></a>

레시피는 주로 Chef *리소스* 집합으로 구성됩니다. 각각의 리소스는 설치할 패키지나 시작할 서비스 같은 인스턴스 최종 상태의 특정 측면을 지정합니다. 예제에는 다음 4개의 리소스가 있습니다.
+ 설치된 패키지를 나타내는 `package` 리소스입니다. 이 예시에서는 [HAProxy 서버](http://haproxy.1wt.eu/)입니다.
+ 이 예제에서 HAProxy 서비스에 해당하는 서비스를 나타내는 `service` 리소스.
+ 이 예제에서 2개의 HAProxy 구성 파일에 해당하는, 지정된 템플릿에서 생성할 파일을 나타내는 2개의 `template` 리소스.

리소스는 인스턴스 상태를 지정하는 선언적 방법을 제공합니다. 백그라운드에서는 각각의 리소스에 패키지 설치, 디렉터리 생성 및 구성, 서비스 시작 등등의 필요한 작업을 수행하는 연결된 *공급자*가 있습니다. 작업의 세부 사항이 특정 운영 체제에 따라 다른 경우, 리소스는 여러 개의 공급자를 가지며 시스템에 적합한 공급자를 사용합니다. 예를 들어 Red Hat Linux 시스템에서 `package` 공급자는 `yum`을 사용하여 패키지를 설치합니다. Ubuntu Linux 시스템에서 `package` 공급자는 `apt-get`을 사용합니다.

다음과 같은 일반적 형식을 사용하여 Ruby 코드 블록으로 리소스를 구현합니다.

```
resource_type "resource_name" do
  attribute1 'value1'
  attribute2 'value2'
  ...
  action :action_name
  notifies : action 'resource'
end
```

요소는 다음과 같습니다.

**리소스 유형**  
(필수) 예제에는 세 가지 리소스 형식(`package`, `service`, `template`)이 포함됩니다.

**리소스 이름**  
(필수) 이름은 특정 리소스를 식별하며, 경우에 따라 속성 중 하나의 기본값으로 사용됩니다. 예제에서 `package`는 `haproxy`라는 이름의 패키지 리소스를 나타내며, 첫 번째 `template` 리소스는 `/etc/default/haproxy`라는 이름의 구성 파일을 나타냅니다.

**속성**  
(선택 사항) 속성은 리소스 구성을 지정하며, 리소스 유형 및 리소스 구성 방법에 따라 달라집니다.  
+ 예제의 `template` 리소스는 생성된 파일의 원본, 소유자, 그룹, 모드를 지정하는 속성 세트를 명시적으로 정의합니다.
+ 예제의 `package` 및 `service` 리소스는 어떤 속성도 명시적으로 정의하지 않습니다.

  리소스 이름은 일반적으로 필수 속성의 기본값이며, 필요한 전부인 경우도 있습니다. 예를 들어 리소스 이름은 `package` 리소스의 `package_name` 속성에 대한 기본값이며, 이것이 유일한 필수 속성입니다.
가드 속성이라고 하는 몇 가지 특화된 속성도 있는데, 리소스 공급자가 언제 작업을 수행할지 지정합니다. 예를 들어 `only_if` 속성은 지정된 조건이 충족되는 경우에만 작업을 수행하라고 리소스 공급자에게 명령합니다. HAProxy 레시피는 가드 속성을 사용하지 않지만 다음 몇 가지 예제에서는 가드 속성을 사용합니다.

**작업 및 알림**  
(선택 사항) 작업 및 알림은 공급자가 수행할 작업을 지정합니다.  
+ `action`은 설치 또는 생성 등 지정된 작업을 하도록 공급자에게 명령합니다.

  각 리소스에는 특정 리소스에 따라 달라지는 작업 세트가 있으며, 이 중 하나는 기본 작업입니다. 예제에서 `package` 리소스의 작업은 `install`인데, 공급자에게 패키지를 설치하라고 명령합니다. 첫 번째 `template` 리소스에는 `action` 요소가 없기 때문에 공급자는 기본 `create` 작업을 수행합니다.
+ `notifies`는 다른 리소스의 공급자에게 작업을 수행할 것을 명령하지만 리소스의 상태가 변경된 경우에 한합니다.

  `notifies`는 일반적으로 `template` 및 `file` 같은 리소스와 함께 사용되어 구성 파일 수정 후 서비스 재시작 같은 작업을 수행합니다. 리소스에는 기본 알림이 없습니다. 알림을 원하는 경우, 리소스에 명시적인 `notifies` 요소가 있어야 합니다. HAProxy 레시피에서 두 번째 `template` 리소스는 연결된 구성 파일이 변경된 경우, haproxy `service` 리소스에 HAProxy 서비스를 다시 시작하라고 알립니다.

리소스가 운영 체제에 따라 달라지는 경우가 있습니다.
+ 일부 리소스는 Linux 또는 Windows 시스템에서만 사용할 수 있습니다.

  예를 들어 [패키지](https://docs.chef.io/chef/resources.html#package)는 Linux 시스템에 패키지를 설치하고, [windows\$1package](https://docs.chef.io/chef/resources.html#windows-package)는 Windows 시스템에 패키지를 설치합니다.
+ 일부 리소스는 어떤 운영 체제에도 사용할 수 있지만 특정 시스템에 고유한 속성을 가지고 있습니다.

  예를 들어 [파일](https://docs.chef.io/chef/resources.html#file) 리소스는 Linux 시스템이나 Windows 시스템에서 사용할 수 있지만 구성 권한에 대한 속성을 별도로 가지고 있습니다.

각 리소스의 사용 가능한 속성, 작업, 알림을 포함한 표준 리소스에 대한 설명은 [리소스 및 공급자에 대하여](https://docs.chef.io/resource.html)를 참조하세요.

## 흐름 제어
<a name="cookbooks-101-basics-structure-ruby"></a>

레시피는 Ruby 애플리케이션이므로 Ruby 제어 구조를 사용하여 흐름 제어를 레시피에 통합할 수 있습니다. 예를 들어 Ruby 조건부 논리를 사용하여 레시피가 시스템에 따라 다르게 동작하도록 할 수 있습니다. HAProxy 레시피에 포함된 `if` 블록은 레시피가 Debian 또는 Ubuntu 시스템에서 실행되는 경우에만 `template` 리소스를 사용하여 구성 파일을 생성합니다.

다른 일반적 시나리오는 루프를 사용하여 하나의 리소스를 상이한 속성 설정으로 여러 번 실행하는 것입니다. 예를 들어 루프를 사용해 `directory` 리소스를 서로 다른 디렉터리 이름으로 여러 번 실행하여 디렉터리 집합을 생성할 수 있습니다.

**참고**  
Ruby에 익숙하지 않다면 대부분의 레시피에 대해 알아야 할 내용을 다루고 있는 [Just Enough Ruby for Chef](https://docs.chef.io/just_enough_ruby_for_chef.html)를 참조하세요.

## 포함된 레시피
<a name="cookbooks-101-basics-structure-include"></a>

`include_recipe`는 코드의 다른 레시피를 포함하며, 레시피를 모듈화하여 여러 레시피에서 같은 코드를 다시 사용할 수 있도록 해 줍니다. 호스트 레시피 실행 시 Chef는 호스트 레시피를 실행하기 전에 각각의 `include_recipe` 요소를 지정된 레시피의 코드로 대체합니다. 표준 Chef `cookbook_name::recipe_name` 구문을 사용하여 포함된 레시피를 식별합니다. 여기서 `recipe_name`에는 `.rb` 확장명이 생략되어 있습니다. 예제에는 HAProxy 서비스를 나타내는 하나의 레시피인 `haproxy::service`가 포함됩니다.

**참고**  
Chef 11.10 이후 버전에서 실행되는 레시피에서 `include_recipe`를 사용하여 다른 쿡북의 레시피를 포함시키려면 `depends` 문을 사용하여 쿡북의 `metadata.rb` 파일에서 종속성을 선언해야 합니다. 자세한 내용은 [레시피 구현: Chef 11.10](workingcookbook-chef11-10.md) 섹션을 참조하세요.