

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

# ステップ 3: カスタムクックブックを作成してデプロイする
<a name="other-services-redis-cookbook"></a>

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

現時点では、スタックはまだ完全には機能していません。アプリケーションが Redis サーバーにアクセスできるようにする必要があります。最も柔軟性のある方法は、アクセス情報が含まれた YAML ファイルをアプリケーションの `config` サブフォルダに配置することです。そうすれば、アプリケーションはこのファイルから情報を取得できるようになります。この方法を使用すると、アプリケーションを書き直して再デプロイすることなく接続情報を変更できます。この例では、ファイルに `redis.yml` という名前を付ける必要があり、次のように ElastiCache クラスターのホスト名とポートを含めます。

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

このファイルをサーバーに手動でコピーすることはできますが、Chef *レシピ*を実装してファイルを生成し、すべてのサーバーで OpsWorks スタックでレシピを実行することをお勧めします。Chef レシピは、 OpsWorks スタックがパッケージのインストールや設定ファイルの作成などのタスクをインスタンスで実行するために使用する特殊な 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 、各インスタンスにインストールされ、[スタックとデプロイされたアプリケーションに関する詳細情報を含む スタックスタック設定およびデプロイ JSON](workingcookbook-json.md) オブジェクトのデータによって異なります。このオブジェクトの `deploy` ノードの構造は次のとおりです。

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

deploy ノードには、デプロイする各アプリケーションに対応し、そのアプリケーションの短縮名が付けられた一連の埋め込み JSON オブジェクトが含まれます。各アプリケーションオブジェクトには、アプリケーションの設定 (ドキュメントのルートやアプリケーションタイプなど) を定義する一連の属性が含まれます。deploy 属性のリストについては、「[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. **[Configuration Management]** (構成の管理) セクションで、**[Use custom Chef cookbooks]** (カスタム　Chef のクックブックを使用) を **[Yes]** (はい) に設定し、クックブックリポジトリの情報を入力します。次に、**[Save]** (保存) をクリックしてスタック設定を更新します。  
![\[Configuration form for custom Chef cookbooks with repository details and options.\]](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/images/redis_walkthrough_cookbook.png)

1. **[Stack]** (スタック) ページで **[Run Command]** (コマンドの実行) をクリックし、**[Update Custom Cookbooks]** (カスタムクックブックの更新) スタックコマンドを選択します。次に、**[Update Custom Cookbooks]** (カスタムクックブックの更新) をクリックして、インスタンスのクックブックキャッシュに新しいクックブックをインストールします。  
![\[Run Command interface showing Update Custom Cookbooks option and instance selection for Rails App Server.\]](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/images/redis_walkthrough_command.png)

クックブックを変更した場合は、[**Update Custom Cookbooks**] をもう一度実行して、最新バージョンをインストールします。この手順の詳細については、「[カスタムクックブックのインストール](workingcookbook-installingcustom-enable.md)」を参照してください。