

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ステップ 2.3: カスタムクックブックの実装
<a name="gettingstarted-windows-cookbook"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](https://aws.amazon.com/support)を通じて AWS サポート チームにお問い合わせください。

スタックは、基本的にはインスタンスのコンテナですが、インスタンスを直接スタックに追加することはありません。それぞれ関連するインスタンスのグループを表すレイヤーを 1 つ以上追加し、そのレイヤーにインスタンスを追加します。

レイヤーは基本的に、同じ設定の Amazon EC2 インスタンスのセットを作成するために OpsWorks スタックが使用する設計図です。インスタンスは、オペレーティングシステムの基本バージョンから開始し、インスタンスのレイヤーはさまざまなタスクをインスタンスで実行して、次のような設計図を実装します。
+ ディレクトリとファイルの作成
+ ユーザーの管理
+ ソフトウェアのインストールと設定
+ サーバーの起動または停止
+ アプリケーションコードおよび関連ファイルのデプロイ

レイヤーは、[[Chef recipes]](https://docs.chef.io/recipes.html) (シェフのレシピ) (略してレシピ)を実行してインスタンスに対してタスクを実行します。レシピは、インスタンスの最終的な状態を記述する Chef のドメイン固有言語 (DSL) を使用する Ruby アプリケーションです。 OpsWorks スタックでは、各レシピは通常、レイヤーの[ライフサイクルイベント](workingcookbook-events.md)、セットアップ、設定、デプロイ、デプロイ解除、シャットダウンのいずれかに割り当てられます。インスタンスでライフサイクルイベントが発生すると、 OpsWorks Stacks はイベントのレシピを実行して適切なタスクを実行します。例えば、Setup イベントは、インスタンスの起動が完了した後に発生します。 OpsWorks スタックは Setup レシピを実行します。このレシピは通常、サーバーソフトウェアのインストールと設定、関連サービスの開始などのタスクを実行します。

OpsWorks スタックは、標準タスクを実行する一連の組み込みレシピを各レイヤーに提供します。カスタムレシピを実装して追加タスクを実行し、レイヤーのライフサイクルイベントに割り当てることで、レイヤーの機能を拡張できます。Windows スタックは、いくつかの基本タスクのみ実行する最小限のレシピセットを持つ[カスタムレイヤー](workinglayers-custom.md)をサポートします。Windows インスタンスに機能を追加するには、ソフトウェアのインストール、アプリケーションのデプロイなどを行うカスタムレシピを実装する必要があります。このトピックでは、IIS インスタンスをサポートするシンプルなカスタムレイヤーを作成する方法を説明します。

**Topics**
+ [クックブックとレシピの簡単な説明](#gettingstarted-windows-layer-recipes)
+ [IIS のインストールと起動を行うレシピの実装](#gettingstarted-windows-layer-recipe-iis)
+ [カスタムクックブックの有効化](#gettingstarted-windows-layer-enable-cookbook)

## クックブックとレシピの簡単な説明
<a name="gettingstarted-windows-layer-recipes"></a>

レシピは、インスタンスの予想される状態の 1 つ以上の側面を定義します (存在するディレクトリ、インストールが必要なソフトウェアパッケージ、デプロイが必要なアプリケーションなど)。レシピは、*クックブック*にパッケージ化されており、通常は 1 つ以上の関連レシピと、設定ファイルを作成するためのテンプレートなどの関連するファイルが含まれています。

このトピックは、レシピのかなり基本的な説明であり、クックブックを実装してシンプルなカスタム IISレイヤーをサポートする方法のみ示しているにすぎません。クックブックのより全般的な説明については、「[クックブックとレシピ](workingcookbook.md)」を参照してください。Windows 固有のトピックを含む、クックブックの実装方法の詳細なチュートリアルについては、「[クックブック 101](cookbooks-101.md)」を参照してください。

Chef レシピは、技術的には Ruby アプリケーションですが、コードの大部分 (すべてではありません) は Chef DSL で記述されています。DSL の大部分は、インスタンスの状態の側面を宣言により指定するために使用できる一連の*リソース*で構成されています。例えば、[`directory` リソース](https://docs.chef.io/chef/resources.html#directory)は、システムに追加するディレクトリを定義します。次の例は、指定されたユーザーに属する、フルコントロール権限を持つ `C:\data` ディレクトリを定義しており、親ディレクトリの権限を継承しません。

```
directory 'C:\data' do
  rights :full_control, 'WORKGROUP\username'
  inherits false
  action :create
end
```

Chef は、レシピを実行するとき、関連付けられた*プロバイダ* (インスタンスの状態の変更の詳細を処理する Ruby オブジェクト) にデータを渡すことにより各リソースを実行します。この場合、プロバイダは指定された設定を使用して新しいディレクトリを作成します。

カスタム IISレイヤー用のカスタムクックブックは、次のタスクを実行する必要があります。
+ IIS 機能をインストールし、サービスを起動します。

  通常は、インスタンスの起動が終了した直後のセットアップ中にこのタスクを実行します。
+ アプリケーションをインスタンスにデプロイします (この例ではシンプルな HTML ページ)。

  通常は、セットアップ時にこのタスクを実行します。ただし、アプリケーションは通常定期的に更新する必要があるため、インスタンスがオンラインのときに更新をデプロイする必要もあります。

1 つのレシピでこれらのすべてのタスクを実行する必要があります。ただし、セットアップタスクとデプロイタスクに別個のレシピを使用することをお勧めします。このようにして、セットアップコードを実行しなくても、いつでもアプリケーションの更新をデプロイすることができます。以下では、クックブックをセットアップしてカスタム IISレイヤーをサポートする方法について説明します。以降のトピックでは、レシピを実装する方法を示します。

**開始するには、以下の手順を実行します。**

1. ワークステーション上の適切な場所に、`iis-cookbook` というディレクトリを作成します。

1. `iis-cookbook` に、次のコンテンツを含む `metadata.rb` ファイルを追加します。

   ```
   name "iis-cookbook"
   version "0.1.0"
   ```

   この例では、最小限の `metadata.rb` を使用します。このファイルを使用する方法の詳細については、「[metadata.rb](https://docs.chef.io/config_rb_metadata.html)」を参照してください。

1. `iis-cookbook` に `recipes` ディレクトリを追加します。

   このディレクトリ (名前を `recipes` にする必要があります) には、クックブックのレシピが含まれています。

通常、クックブックには他のさまざまディレクトリを含めることができます。たとえば、レシピがテンプレートを使用して設定ファイルを作成する場合、テンプレートは通常 `templates\default` ディレクトリに配置されます。この例のクックブックは完全にレシピで構成されているため、他のディレクトリは必要ありません。また、この例では、1 つのクックブックを使用しますが、必要な数のクックブックを使用できます。複雑なプロジェクトでは、多くの場合、複数のクックブックを使用することが推奨されます。たとえば、セットアップタスクとデプロイタスクに別個のクックブックを使用することができます。クックブックのその他の例については、「[クックブックとレシピ](workingcookbook.md)」を参照してください。

## IIS のインストールと起動を行うレシピの実装
<a name="gettingstarted-windows-layer-recipe-iis"></a>

 IIS は Windows の*機能*の 1 つであり、Windows Server に必要に応じてインストールできる一連のシステムコンポーネントに含まれます。レシピには、次のいずれかの方法で IIS をインストールさせることができます。
+ [https://docs.chef.io/chef/resources.html#powershell-script](https://docs.chef.io/chef/resources.html#powershell-script) リソースお使用して [https://docs.microsoft.com/en-us/powershell/module/servermanager/install-windowsfeature?view=winserver2012-ps](https://docs.microsoft.com/en-us/powershell/module/servermanager/install-windowsfeature?view=winserver2012-ps) コマンドレットを実行する。
+ Chef [Windows クックブック](https://github.com/opscode-cookbooks/windows)の `windows_feature` リソースを使用する。

  `windows` クックブックには一連のリソースが含まれており、これらのリソースのプロバイダは、[Deployment Image Servicing and Management](https://technet.microsoft.com/en-us/library/dd744256%28v=ws.10%29.aspx) (DISM) を使用して Windows インスタンスでさまざまなタスク (機能のインストールなど) を実行します。

**注記**  
`powershell_script` は、特に Windows レシピに役立ちます。これを使うと、PowerShell スクリプトまたはコマンドレットを実行する方法によりインスタンスでさまざまなタスクを実行することができます。特に、Chef リソースによってサポートされていないタスクに役立ちます。

この例は、PowerShell スクリプトを実行して Web Server (IIS) をインストールおよび起動する例です。`windows` クックブックについては後で説明します。`windows_feature` を使用して IIS をインストールする方法の例については、「[Windows の機能のインストール: IIS](cookbooks-101-opsworks-install-software-feature.md)」を参照してください。

以下の内容で `install.rb` という名前のレシピをクックブックの `recipes` ディレクトリに追加します。

```
powershell_script 'Install IIS' do
  code 'Install-WindowsFeature Web-Server'
  not_if "(Get-WindowsFeature -Name Web-Server).Installed"
end

service 'w3svc' do
  action [:start, :enable]
end
```

レシピには、2 つのリソースが含まれています。

**powershell\$1script**  
`powershell_script` は、指定された PowerShell スクリプトまたはコマンドレットを実行します。例では、以下の属性設定を使用します。  
+ `code` - 実行するための PowerShell コマンドレット。

  この例は、Web Server (IIS) をインストールする `Install-WindowsFeature` コマンドレットを実行する例です。通常、`code` 属性の行数に制限はないため、必要な数のコマンドレットを実行できます。
+ `not-if` - IIS がまだインストールされていない場合にのみレシピが IIS をインストールするようにする [[*guard attribute* (ガード属性)](https://docs.chef.io/chef/resources.html#guards)]。

  通常は、レシピを [*idempotent*] (べき等) にするため、同じタスクを複数回実行して時間を無駄にすることがありません。
各リソースには、プロバイダが実行するアクションを指定するアクションがあります。この例には明示的なアクションがないため、プロバイダはデフォルトの `:run` アクションを実行します、これにより指定された PowerShell スクリプトが実行されます。詳細については、「[Windows PowerShell スクリプトを実行する](cookbooks-101-opsworks-opsworks-powershell.md)」を参照してください。

**service**  
[https://docs.chef.io/chef/resources.html#service](https://docs.chef.io/chef/resources.html#service) はサービス (この場合、Web Server IIS サービス (W3SVC)) を管理します。この例では、デフォルト属性を使用し、IIS を起動および有効化する 2 つのアクション (`:start` と `:enable`) を指定します。

**注記**  
パッケージインストーラを使用するソフトウェアをインストールする場合 (MSI など)、`windows_package` リソースを使用できます。詳細については、「[パッケージのインストール](cookbooks-101-opsworks-install-software-package.md)」を参照してください。

## カスタムクックブックの有効化
<a name="gettingstarted-windows-layer-enable-cookbook"></a>

OpsWorks スタックは、各インスタンスのローカルキャッシュからレシピを実行します。カスタムレシピを実行するには、以下を実行する必要があります。
+ リモートリポジトリにクックブックを保存します。

  OpsWorks スタックは、このリポジトリから各インスタンスのローカルキャッシュにクックブックをダウンロードします。
+ カスタムクックブックが有効になるようにスタックを編集します。

  カスタムクックブックはデフォルトで無効なため、スタックのカスタムクックブックを有効にし、リポジトリ URL および関連情報を指定する必要があります。

OpsWorks スタックはカスタムクックブックの S3 アーカイブと Git リポジトリをサポートします。この例では S3 アーカイブを使用します。詳細については、「[クックブックリポジトリ](workingcookbook-installingcustom-repo.md)」を参照してください。

**S3 アーカイブを使用するには**

1. `.zip` ディレクトリの `iis-cookbook` アーカイブを作成します。

   OpsWorks スタックは、Windows スタックの `.tgz` (gzip 圧縮 tar) アーカイブもサポートしています。

1. アーカイブを米国西部 (カルフォルニア北部) リージョンの S3 バケットにアップロードし、ファイルを公開します。プライベート S3 アーカイブを使用することもできますが、この例ではパブリックアーカイブで十分であり、作業がいくらかシンプルになります。

   1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) で Amazon S3 コンソールを開きます。

   1. `us-west-1` 内にバケットがまだ存在しない場合は、[**Create Bucket**] (バケットを作成する) を選択して、バケットを米国西部 (カリフォルニア北部)リージョン内に作成します。

   1. バケットリストの中からファイルをアップロードしたいバケットの名前を選択し、[**Upload**] を選択します。

   1. [**Add Files**] を選択します。

   1. アップロードするアーカイブを選択し、[**Open**] を選択します。

   1. [**Upload - Select Files and Folders**] ダイアログの下部で、[**Set Details**] を選択します。

   1. [**Set Details**] ダイアログの下部で、[**Set Permissions**] を選択します。

   1. [**Set Permissions**] ダイアログで、[**Make everything public**] を選択します。

   1. [**Set Permissions**] ダイアログの下部で、[**Start Upload**] を選択します。アップロードが終了すると、`iis-cookbook.zip` ファイルがバケット内に表示されます。

   1. バケットを選択し、選択したバケットの [**Properties**] タブを選択します。[**Link**] の横で、後で使用できるように、アーカイブファイルの URL を記録します。

   Amazon S3 バケットへのファイルのアップロードの詳細については、*「Amazon S3 Console User Guide」*(Amazon S3 コンソールユーザーガイド) で[「How Do I Upload Files and Folders to an S3 Bucket?](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html) (S3 バケットにファイルとフォルダをアップロードする方法) を参照してください。

**重要**  
この時点までで、ウォークスルーにかかるコストはほんのわずかです。 OpsWorks スタックサービス自体は無料です。ただし、Amazon S3 ストレージなど、使用する AWS リソースには料金がかかります。アーカイブをアップロードするとすぐに料金が発生し始めます。詳細については、「[AWS の料金](https://aws.amazon.com/pricing/)」を参照してください。

**スタックのカスタムクックブックを有効にするには**

1.  OpsWorks スタックコンソールで、ナビゲーションペインで**スタック**を選択し、右上の**スタック設定**を選択します。

1. [**Settings**] ページの右上にある [**Edit**] を選択します。

1. [**Settings**] ページで、[**Use custom Chef cookbooks**] を [**Yes**] に設定し、次の情報を入力します。
   + [リポジトリタイプ] - **[S3 Archive]** (S3 アーカイブ)
   + [リポジトリ URL] - 以前に記録したクックブックアーカイブファイルの S3 URL。

1. [**Save**] を選択してスタック設定を更新します。

OpsWorks スタックは、すべての新しいインスタンスにカスタムクックブックをインストールします。 OpsWorks スタックは、オンラインインスタンスにはカスタムクックブックを自動的にインストールまたは更新しない点に注意してください。これは、後で説明するように、手動で行うことができます。