

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

# 短いディグレッション: クックブック、レシピ、 OpsWorks スタック属性
<a name="gettingstarted-db-recipes"></a>

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

これでアプリケーションとデータベースサーバーを設定しましたが、まだ使用する準備はできていません。データベースを設定し、アプリの接続設定を構成する必要があります。 OpsWorks スタックはこれらのタスクを自動的に処理しませんが、Chef クックブック、レシピ、動的属性をサポートしています。レシピのペアを実装できます。1 つはデータベースをセットアップするため、もう OpsWorks 1 つはアプリケーションの接続設定を構成するため、 スタックで実行させることができます。

必須のレシピを含む phpapp クックブックはすでに実装されており、使用できます。必要に応じて、「[ステップ 3.3: MyStack にカスタムクックブックを追加する](gettingstarted-db-cookbooks.md)」に進むこともできます。詳細が必要な場合は、このセクションで、クックブックとレシピの背景を紹介し、レシピの仕組みについて説明します。クックブック自体を確認するには、[phpapp クックブック](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/phpapp)を参照してください。

**Topics**
+ [レシピと属性](#gettingstarted-db-recipes-attributes)
+ [データベースのセットアップ](#gettingstarted-db-recipes-dbsetup)
+ [アプリケーションをデータベースに接続する](#gettingstarted-db-recipes-appsetup)

## レシピと属性
<a name="gettingstarted-db-recipes-attributes"></a>

Chef レシピは基本的に、パッケージのインストール、設定ファイルの作成、シェルコマンドの実行などのタスクをインスタンスで実行する特殊な Ruby アプリケーションです。関連のレシピのグループは*クックブック*としてまとめられます。クックブックには、設定ファイルを作成するためのテンプレートなどのサポートファイルも含まれます。

OpsWorks スタックには、組み込みレイヤーをサポートするクックブックのセットがあります。独自のレシピでカスタムクックブックを作成して、インスタンスでカスタムタスクを実行することもできます。このトピックでは、レシピについて簡単に説明し、レシピを使用してデータベースのセットアップやアプリケーションの接続の設定を行う方法を示します。クックブックとレシピの詳細については、「[クックブックとレシピ](workingcookbook.md)」または「[OpsWorks スタックのカスタマイズ](customizing.md)」を参照してください。

レシピは通常、入力データの *Chef 属性*によって決まります。
+ これらの属性の一部は Chef によって定義され、オペレーティングシステムなど、インスタンスに関する基本情報を提供します。
+ OpsWorks スタックは、レイヤー設定などのスタックに関する情報と、アプリケーションリポジトリなどのデプロイされたアプリケーションに関する情報を含む一連の属性を定義します。

  スタックまたはデプロイに[カスタム JSON](workingstacks-json.md) を割り当てることによって、これらの属性にカスタム属性を追加できます。
+ クックブックでも、クックブックに固有の属性を定義できます。

  phpapp クックブック属性は、すべて `attributes/default.rb` で定義されます。

スタック属性の完全なリストについては、 OpsWorks [スタック設定およびデプロイ属性: Linux](attributes-json-linux.md)「」および「」を参照してください[組み込みクックブックの属性](attributes-recipes.md)。詳細については、「[属性の上書き](workingcookbook-attributes.md)」を参照してください。

属性は階層構造で構成され、JSON オブジェクトとして表すことができます。

このデータを、次のような Chef ノード構文を使用することによって、アプリケーションに組み込むことができます。

```
[:deploy][:simplephpapp][:database][:username]
```

`deploy` ノードには、アプリケーションのデータベース、Git リポジトリなどに関する情報を含む 1 つのアプリケーションノード `simplephpapp`ノードがあります。この例は、データベースユーザー名の値を表し、この値が `root` に解決されます。

## データベースのセットアップ
<a name="gettingstarted-db-recipes-dbsetup"></a>

MySQLレイヤーの組み込み Setup レシピによって、アプリケーションの短縮名が付けられたアプリケーション用のデータベースが自動的に作成されるため、この例では、すでに simplephpapp という名前のデータベースが存在します。ただし、アプリケーションでデータを保存するためのテーブルを作成してセットアップを終了する必要があります。テーブルは手動で作成できますが、タスクを処理するカスタムレシピを実装し、 OpsWorks スタックで実行することをお勧めします。このセクションでは、レシピ `dbsetup.rb` を実装する方法を説明します。後で、 OpsWorks スタックでレシピを実行する手順について説明します。

リポジトリ内のレシピを表示するには、[dbsetup.rb](https://github.com/amazonwebservices/opsworks-example-cookbooks/blob/master/phpapp/recipes/dbsetup.rb) に移動します。次の例に `dbsetup.rb` のコードを示します。

`execute` は、指定されたコマンドを実行する *Chef リソース*です。この場合は、テーブルを作成する MySQL コマンドです。`not_if` ディレクティブによって、指定されたテーブルがすでに存在する場合、コマンドは実行されません。Chef リソースの詳細については、「[リソースおよびプロバイダについて](https://docs.chef.io/resource.html)」を参照してください。

このレシピは、前に説明したノードの構文を使用して、コマンド文字列に属性値を挿入します。たとえば、次のようにしてデータベースのユーザー名を挿入します。

```
#{deploy[:database][:username]}
```

この暗号のようなコードを展開してみましょう。
+ 反復のたびに `deploy` は現在のアプリケーションノードに設定されるため、`[:deploy][:app_name]` に解決されます。この例では、`[:deploy][:simplephpapp]` に解決されます。
+ 前に示したデプロイ属性値を使用して、ノード全体は `root` に解決されます。
+ ノードを \$1\$1 \$1 にラップして文字列に挿入します。

その他のノードの多くも同様に解決されます。`#{node[:phpapp][:dbtable]}` は例外で、カスタムクックブックの属性ファイルで定義され、テーブル名 `urler` に解決されます。MySQL インスタンスで実行される実際のコマンドは、次の通りです。

```
"/usr/bin/mysql 
    -uroot
    -pvjud1hw5v8
    simplephpapp
    -e'CREATE TABLE urler(
       id INT UNSIGNED NOT NULL AUTO_INCREMENT,
       author VARCHAR(63) NOT NULL,
       message TEXT,
       PRIMARY KEY (id))'
"
```

このコマンドは、デプロイ属性の認証情報とデータベース名を使用して、ID、作成者、およびメッセージフィールドを持つ、`urler` という名前のテーブルを作成します。

## アプリケーションをデータベースに接続する
<a name="gettingstarted-db-recipes-appsetup"></a>

2 番目の要素はアプリケーションです。アプリケーションはテーブルにアクセスする際にデータベースパスワードなどの接続情報が必要になります。SimplePHPApp では、事実上、作業ファイルは `app.php` のみです。`index.php` は `app.php` を読み込むだけです。

`app.php` にはデータベース接続を処理する `db-connect.php` が含まれていますが、このファイルはリポジトリにはありません。は特定のインスタンスに基づいてデータベースを定義するため、`db-connect.php`db-connect.php を事前に作成することはできません。代わりに、`appsetup.rb` レシピは、デプロイ属性の接続データを使用して `db-connect.php` を生成します。

リポジトリ内のレシピを表示するには、[appsetup.rb](https://github.com/amazonwebservices/opsworks-example-cookbooks/blob/master/phpapp/recipes/appsetup.rb) に移動します。次の例に `appsetup.rb` のコードを示します。

`dbsetup.rb` と同様に、`appsetup.rb` は、`deploy` ノードでアプリケーション (ここでも simplephpapp) を繰り返し処理します。これは、`script` リソースと `template` リソースを含むコードブロックを実行します。

この `script` リソースは、PHP アプリケーションの依存性マネージャーである [[Composer]](http://www.getcomposer.org) (コンポーザー) をインストールします。次に、Composer の `install` コマンドを実行して、サンプルアプリケーションの依存ファイルをアプリケーションのルートディレクトリにインストールします。

`template` リソースは、`db-connect.php` を生成して、これを `/srv/www/simplephpapp/current` に配置します。次の点に注意してください。
+ レシピでは、条件ステートメントを使用して、インスタンスのオペレーティングシステムによって異なるファイル所有者を指定します。
+ `only_if` ディレクティブは、指定されたディレクトリが存在する場合にのみテンプレートを生成するように Chef に指示します。

`template` リソースは、基本的に関連ファイルと同じコンテンツと構造を持っているが、さまざまなデータ値のプレースホルダが含まれているテンプレートを操作します。`source` パラメータは、テンプレート `db-connect.php.erb` を指定します。このテンプレートは、phpapp のクックブックの `templates/default` ディレクトリにあり、次の内容が含まれます。

Chef はテンプレートを処理するときに、プレースホルダ `<%= =>` を template リソース内の対応する変数の値に置き換えます。これらの変数はデプロイ属性から取得されます。したがって、生成されるファイルは次のようになります。