

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

# スタック Linux OpsWorks インスタンスでのレシピの実行
<a name="cookbooks-101-opsworks-opsworks-instance"></a>

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

Test Kitchen と Vagrant は、クックブックを実装するシンプルで効率的な方法を提供しますが、クックブックのレシピが本番環境で正しく実行されることを確認するには、 OpsWorks スタックインスタンスで実行する必要があります。このトピックでは、カスタムクックブックを OpsWorks スタックの Linux インスタンスにインストールし、単純なレシピを実行する方法について説明します。また、レシピのバグを効率的に修正するためのヒントも紹介します。

Windows インスタンスでレシピを実行する方法の詳細については、「[Windows インスタンスでのレシピの実行](cookbooks-101-opsworks-opsworks-windows.md)」を参照してください。

**Topics**
+ [レシピの作成と実行](#opsworks-opsworks-instance-create)
+ [レシピの自動実行](#cookbooks-101-opsworks-opsworks-instance-events)
+ [レシピのトラブルシューティングと修正](#cookbooks-101-opsworks-opsworks-instance-bugs)

## レシピの作成と実行
<a name="opsworks-opsworks-instance-create"></a>

最初に、スタックを作成する必要があります。以下に、この例のスタックを作成する方法を簡単に示します。詳細については、「[新しいスタックを作成する](workingstacks-creating.md)」を参照してください。

**スタックを作成するには**

1. [OpsWorks スタックコンソール](https://console.aws.amazon.com/opsworks/)を開いて [**Add Stack**] をクリックします。

1. 次の設定を指定し、その他の設定はデフォルト値を受け入れて、[**Add Stack**] をクリックします。
   + **Name** (名前) - OpsTest
   + **Default SSH key** (デフォルト SSH キー) - Amazon EC2 キーペア

   Amazon EC2 キーペアの作成が必要な場合は、[「Amazon EC2 Key Pairs」](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)(Amazon EC2 キーペア) を参照してください。キーペアがインスタンスと同じ AWS リージョンに属している必要があることに注意してください。この例では、デフォルトに米国西部(オレゴン) リージョンを使用します。

1. [**Add a layer**] をクリックし、次の設定を使用してスタックに[カスタムレイヤーを追加](workinglayers-custom.md)します。
   + **Name** (名前) - OpsTest
   + **Short name** (短縮名) - opstest

   Linux スタックの場合、どのレイヤータイプでも実際には動作しますが、この例は他のレイヤータイプによってインストールされるパッケージを必要としないので、カスタムレイヤーが最も簡単なアプローチです。

1. デフォルト設定でレイヤーに [24/7 インスタンスを追加](workinginstances-add.md)し、[起動](workinginstances-starting.md)します。

インスタンスの起動中に (通常は数分かかります)、クックブックを作成できます。この例では、「[条件付きロジック](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional)」のレシピをわずかに変更したバージョンを使用して、データディレクトリを作成します。ディレクトリの名前は、プラットフォームに依存します。

**クックブックをセットアップするには**

1. `opsworks_cookbooks` 内に `opstest` という名前のディレクトリを作成し、そこに移動します。

1. 以下の内容で `metadata.rb` ファイルを作成し、`opstest` に保存します。

   ```
   name "opstest"
   version "0.1.0"
   ```

1. `recipes` 内に `opstest` ディレクトリを作成します。

1. 次のレシピで `default.rb` ファイルを作成し、`recipes` ディレクトリに保存します。

   ```
   Chef::Log.info("******Creating a data directory.******")
   
   data_dir = value_for_platform(
     "centos" => { "default" => "/srv/www/shared" },
     "ubuntu" => { "default" => "/srv/www/data" },
     "default" => "/srv/www/config"
   )
   
   directory data_dir do
     mode 0755
     owner 'root'
     group 'root'
     recursive true
     action :create
   end
   ```

   レシピによってメッセージが記録されますが、そのために `Chef::Log.info` が呼び出されることに注意してください。この例では Test Kitchen を使用していないため、 `log`メソッドはあまり有用ではありません。 `Chef::Log.info` はメッセージを Chef ログに配置します。これは Chef の実行が完了した後に読み取ることができます。 OpsWorks スタックでは、後で説明するように、これらのログを簡単に表示できます。
**注記**  
Chef ログには、通常、多くの日常的で比較的重要ではない情報が含まれています。メッセージテキストを「\$1」文字で囲んでおくと、見分けるのが容易になります。

1. `opsworks_cookbooks` の `.zip` アーカイブを作成します。 OpsWorks スタックインスタンスにクックブックをインストールするには、そのクックブックをリポジトリに保存し、インスタンスにクックブックをダウンロードするために必要な情報を OpsWorks スタックに提供する必要があります。サポートされている任意のリポジトリのタイプにクックブックを保存できます。この例では、クックブックを含むアーカイブファイルを Amazon S3 バケットに保存します。クックブックリポジトリの詳細については、「[クックブックリポジトリ](workingcookbook-installingcustom-repo.md)」を参照してください。
**注記**  
わかりやすいように、この例では `opsworks_cookbooks` ディレクトリ全体をアーカイブします。ただし、1 OpsWorks つのクックブックしか使用しない場合でも、 スタックは のすべてのクックブックをインスタンス`opsworks_cookbooks`にダウンロードします。例のクックブックのみをインストールするには、別の親ディレクトリを作成し、そのディレクトリに `opstest` を移動します。次に、親ディレクトリの `.zip` アーカイブを作成し、`opsworks_cookbooks.zip` の代わりに使用します。  
Amazon S3 バケットに配信されるコンテンツには、カスタマーコンテンツが含まれている場合があります。機密データの削除の詳細については、[「S3 バケットを空にする方法」](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)または[「S3 バケットを削除する方法」](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)を参照してください。

1. [Amazon S3 バケットにアーカイブをアップロード](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html)し、[アーカイブを公開](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)して、アーカイブの URL を記録します。

これで、クックブックをインストールし、レシピを実行できるようになりました。

**レシピを実行するには**

1. [カスタムクックブックを有効にするようにスタックを編集](workingcookbook-installingcustom-enable.md)し、以下の設定を指定します。
   + **Repository type** (リポジトリタイプ) - **S3 Archive** (S3 アーカイブ)
   + **Repository URL** (リポジトリの　 URL) - 前の手順で記録したクックブックアーカイブ URL

   その他の設定にはデフォルト値を使用し、[**Save**] をクリックしてスタック設定を更新します。

1. [[Update Custom Cookbooks] スタックコマンドを実行](workingstacks-commands.md)します。スタックのインスタンスにあるカスタムクックブックの最新バージョンがインストールされます。以前のバージョンのクックブックがある場合は、このコマンドによって上書きされます。

1. **実行するレシピ**を **opstest::default** に設定して**レシピの実行**スタックコマンドを実行することで、レシピを実行します。このコマンドは、`opstest::default` から成る実行リストで Chef 実行を開始します。

レシピが正常に実行された後で、それを検証できます。

**opstest を検証するには**

1. 最初のステップは、[Chef ログ](troubleshoot-debug-log.md)を調べることです。opstest1 インスタンスの **[Log]** (ログ) 列の **[show]** (表示) をクリックして、ログを表示します。下へスクロールすると、下部にログメッセージが表示されます。

   ```
   ...
   [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/attributes/customize.rb in the cache.
   [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/metadata.rb in the cache.
   [2014-07-31T17:01:46+00:00] INFO: ******Creating a data directory.******
   [2014-07-31T17:01:46+00:00] INFO: Processing template[/etc/hosts] action create (opsworks_stack_state_sync::hosts line 3)
   ...
   ```

1. [SSH を使用してインスタンスにログインし](workinginstances-ssh.md)、`/srv/www/` の内容を一覧表示します。

すべてのステップを実行した場合は、予期していた `/srv/www/config` ディレクトリではなく、`/srv/www/shared` ディレクトリが表示されます。次のセクションでは、このようなバグをすばやく修正するためのガイドラインについて説明します。

## レシピの自動実行
<a name="cookbooks-101-opsworks-opsworks-instance-events"></a>

[**Execute Recipes**] コマンドは、カスタムレシピをテストするための便利な方法であるため、ここでの例のほとんどで使用しています。ただし、実際には、インスタンスの起動後やアプリケーションのデプロイ時など、インスタンスのライフサイクルの標準ポイントでレシピを実行します。 OpsWorks スタックは、各レイヤーの一連の[ライフサイクルイベント](workingcookbook-events.md)、セットアップ、設定、デプロイ、デプロイ解除、シャットダウンをサポートすることで、インスタンスでのレシピの実行を簡素化します。適切なライフサイクルイベントにレシピを割り当てることで、 OpsWorks スタックでレイヤーのインスタンスでレシピを自動的に実行させることができます。

通常は、インスタンスの起動が完了したら (Setup イベント)、すぐにディレクトリを作成します。以下に示しているのは、前の例で作成した同じスタックを使用して、セットアップ時にサンプルレシピを実行する方法です。他のイベントにも同じ手順を使用できます。

**セットアップ時にレシピを自動的に実行するには**

1. ナビゲーションペインで、[**Layer**] を選択し、OpsTestレイヤーの [**Recipes**] リンクの横にある鉛筆のアイコンを選択します。

1. **opstest::default** をレイヤーの **セットアップ** レシピに追加します。次に、**[\$1]** をクリックしてレイヤーに追加し、**保存**を選択して設定を保存します。

1. [**Instances**] を選択し、レイヤーに別のインスタンスを追加して、そのインスタンスを起動します。

   インスタンスの名前を `opstest2` に変更する必要があります。起動が完了すると、 OpsWorks スタックは を実行します`opstest::default`。

1. `opstest2` インスタンスがオンラインになった後、`/srv/www/shared` があることを確認します。

**注記**  
Setup、Configure、または Deploy イベントにレシピを割り当てた場合は、[スタックコマンド](workingstacks-commands.md) (Setup および Configure) または[デプロイコマンド](workingapps-deploying.md) (Deploy) を使用してイベントをトリガーすることで、それらのレシピを手動で実行することもできます。イベントに複数のレシピが割り当てられている場合、これらのコマンドによってそれらのレシピがすべて実行されます。

## レシピのトラブルシューティングと修正
<a name="cookbooks-101-opsworks-opsworks-instance-bugs"></a>

予期した結果が得られなかったり、レシピが正常に実行されなかったりする場合、通常は Chef ログの調査からトラブルシューティングを始めます。これには、実行の詳細な説明と、レシピからのインラインログメッセージが含まれます。ログは、レシピが単純に失敗した場合に、特に便利です。そのような場合には、エラーが記録されます (スタックトレースなど)。

この例のようにレシピが成功した場合、Chef ログはあまり有用ではありません。この場合は、次のように特にレシピの最初の数行を詳しく調べることで、問題の原因を把握できます。

```
Chef::Log.info("******Creating a data directory.******")

data_dir = value_for_platform(
  "centos" => { "default" => "/srv/www/shared" },
  "ubuntu" => { "default" => "/srv/www/data" },
  "default" => "/srv/www/config"
)
...
```

Vagrant でレシピをテストしている場合は CentOS が Amazon Linux の適切な代役ですが、ここでは実際の Amazon Linux インスタンスで実行しています。Amazon Linux のプラットフォーム値は `amazon` です。この値は `value_for_platform` 呼び出しには含まれていないため、レシピはデフォルトで `/srv/www/config` を作成します。トラブルシューティングの詳細については、[デバッグとトラブルシューティングのガイド](troubleshoot.md) を参照してください。

これで問題を特定できたので、レシピを更新し、修正を検証する必要があります。元のソースファイルに戻り、`default.rb` を更新し、新しいアーカイブを Amazon S3 にアップロードするなどの操作を行うことができます。ただし、そのプロセスには手間と時間がかかる場合があります。以下に、例のバグのような単純なレシピのバグで特に便利な、よりすばやいアプローチを示します。インスタンスのレシピを編集する方法です。

**インスタンスのレシピを編集するには**

1. SSH を使用してインスタンスにログインし、`sudo su` を実行して権限を昇格させます。クックブックディレクトリにアクセスするには、ルート権限が必要です。

1. OpsWorks スタックはクックブックを に保存するため`/opt/aws/opsworks/current/site-cookbooks`、 に移動します`/opt/aws/opsworks/current/site-cookbooks/opstest/recipes`。
**注記**  
OpsWorks スタックはクックブックのコピーも に保存します`/opt/aws/opsworks/current/merged-cookbooks`。そのクックブックは編集しないでください。レシピを実行すると、 OpsWorks スタックはクックブックを から `.../site-cookbooks` にコピーするため`.../merged-cookbooks`、 で行った変更は上書き`.../merged-cookbooks`されます。

1. インスタンスでテキストエディタを使用して `default.rb` を編集し、`centos` を `amazon` に置き換えます。これで、レシピは次のようになります。

   ```
   Chef::Log.info("******Creating a data directory.******")
   
   data_dir = value_for_platform(
     "amazon" => { "default" => "/srv/www/shared" },
     "ubuntu" => { "default" => "/srv/www/data" },
     "default" => "/srv/www/config"
   )
   ...
   ```

修正を検証するには、もう一度 **Execute Recipe** スタックコマンドを実行して、レシピを実行します。現在、インスタンスに `/srv/www/shared` ディレクトリがあるはずです。レシピをさらに変更する必要がある場合は、**Execute Recipe** を何度でも実行できます。コマンドを実行するたびにインスタンスを停止および再開する必要はありません。レシピが正常に動作していることを確認できたら、ソースクックブックのコードも必ず更新してください。

**注記**  
レシピをライフサイクルイベントに割り当てて OpsWorks スタックが自動的に実行する場合は、いつでも **Execute Recipe** を使用してレシピを再実行できます。 OpsWorks スタックコンソールを使用して適切なイベントを手動でトリガーすることで、インスタンスを再起動することなく、必要な回数だけレシピを再実行することもできます。ただしこのアプローチでは、イベントのすべてのレシピが実行されます。次の点に注意してください。  
Setup または Configure イベントをトリガーするには、[スタックコマンド](workingstacks-commands.md)を使用します。
Deploy または Undeploy イベントをトリガーするには、[デプロイコマンド](workingapps-deploying.md)を使用します。