AWS OpsWorks スタックの Linux インスタンスでのレシピの実行 - AWS OpsWorks

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

AWS OpsWorks スタックの Linux インスタンスでのレシピの実行

重要

AWS OpsWorks Stacks は新規顧客を受け付けなくなりました。既存のお客様は、2024 年 5 月 26 日までは、通常どおり OpsWorks コンソール、API、CLI、および CloudFormation リソースを使用できます。その時点で廃止されます。この移行に備えて、できるだけ早くスタックを AWS Systems Manager に移行することをおすすめします。詳細については、「AWS OpsWorks Stacks サポート終了に関する FAQ」および「AWS Systems Manager アプリケーションマネージャへの AWS OpsWorks Stacks アプリケーションの移行」を参照してください。

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

Windows インスタンスでレシピを実行する方法の詳細については、「Windows インスタンスでのレシピの実行」を参照してください。

レシピの作成と実行

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

スタックを作成するには
  1. AWS OpsWorks スタックコンソールを開いて [Add Stack] をクリックします。

  2. 次の設定を指定し、その他の設定はデフォルト値を受け入れて、[Add Stack] をクリックします。

    • 名前 – OpsTest

    • Default SSH key (デフォルト SSH キー) - Amazon EC2 キーペア

    Amazon EC2 キーペアの作成が必要な場合は、「Amazon EC2 Key Pairs」(Amazon EC2 キーペア) を参照してください。キーペアがインスタンスと同じ AWS リージョンに属している必要があることに注意してください。この例では、デフォルトに米国西部(オレゴン) リージョンを使用します。

  3. [Add a layer] をクリックし、次の設定を使用してスタックにカスタムレイヤーを追加します。

    • 名前 – OpsTest

    • Short name (短縮名) - opstest

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

  4. デフォルト設定でレイヤーに 24/7 インスタンスを追加し、起動します。

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

クックブックをセットアップするには
  1. opsworks_cookbooks 内に opstest という名前のディレクトリを作成し、そこに移動します。

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

    name "opstest" version "0.1.0"
  3. recipes 内に opstest ディレクトリを作成します。

  4. 次のレシピで 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 の実行が終了した後で、メッセージを読むことができます。AWS OpsWorksスタックでは、後述のように、これらのログを簡単に表示できます。

    注記

    Chef ログには、通常、多くの日常的で比較的重要ではない情報が含まれています。メッセージテキストを「*」文字で囲んでおくと、見分けるのが容易になります。

  5. opsworks_cookbooks.zip アーカイブを作成します。AWS OpsWorks スタックインスタンスにクックブックをインストールするには、クックブックをリポジトリに保存しておき、クックブックをインスタンスにダウンロードするために必要な情報を AWS OpsWorks スタックに指定する必要があります。サポートされている任意のリポジトリのタイプにクックブックを保存できます。この例では、クックブックを含むアーカイブファイルを Amazon S3 バケットに保存します。クックブックリポジトリの詳細については、「クックブックリポジトリ」を参照してください。

    注記

    わかりやすいように、この例では opsworks_cookbooks ディレクトリ全体をアーカイブします。ただし、これは、1 つのクックブックしか使用しない場合でも、AWS OpsWorks のすべてのクックブックが opsworks_cookbooks スタックによってインスタンスにダウンロードされることを意味します。例のクックブックのみをインストールするには、別の親ディレクトリを作成し、そのディレクトリに opstest を移動します。次に、親ディレクトリの .zip アーカイブを作成し、opsworks_cookbooks.zip の代わりに使用します。

    Amazon S3 バケットに配信されるコンテンツには、カスタマーコンテンツが含まれている場合があります。機密データの削除の詳細については、「S3 バケットを空にする方法」または「S3 バケットを削除する方法」を参照してください。

  6. Amazon S3 バケットにアーカイブをアップロードし、アーカイブを公開して、アーカイブの URL を記録します。

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

レシピを実行するには
  1. カスタムクックブックを有効にするようにスタックを編集し、以下の設定を指定します。

    • Repository type (リポジトリタイプ) - S3 Archive (S3 アーカイブ)

    • Repository URL (リポジトリの  URL) - 前の手順で記録したクックブックアーカイブ URL

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

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

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

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

opstest を検証するには
  1. 最初のステップは、Chef ログを調べることです。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) ...
  2. SSH を使用してインスタンスにログインし/srv/www/ の内容を一覧表示します。

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

レシピの自動実行

[Execute Recipes] コマンドは、カスタムレシピをテストするための便利な方法であるため、ここでの例のほとんどで使用しています。ただし実際のところ、レシピは通常、インスタンスのライフサイクルでの標準のポイント (インスタンスの起動完了後やアプリケーションのデプロイ時など) で実行する必要があります。AWS OpsWorksスタックでは、各レイヤーの一連の lifecycle events (ライフサイクルイベント) (セットアップ、構成、デプロイ、アンデプロイ、シャットダウン) をサポートすることで、インスタンスでのレシピの実行を簡略化します。レシピを適切なライフサイクルイベントに割り当てることで、そのレシピが AWS OpsWorks スタックによってレイヤーのインスタンスで自動的に実行されるようにできます。

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

セットアップ時にレシピを自動的に実行するには
  1. ナビゲーションペインでレイヤーを選択し、 OpsTest レイヤーのレシピリンクの横にある鉛筆アイコンを選択します。

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

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

    インスタンスの名前を opstest2 に変更する必要があります。起動の完了後に、AWS OpsWorks スタックによって opstest::default が実行されます。

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

注記

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

レシピのトラブルシューティングと修正

予期した結果が得られなかったり、レシピが正常に実行されなかったりする場合、通常は 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 を作成します。トラブルシューティングの詳細については、デバッグとトラブルシューティングのガイド を参照してください。

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

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

  2. AWS OpsWorks スタックではクックブックが /opt/aws/opsworks/current/site-cookbooks に保存されため、/opt/aws/opsworks/current/site-cookbooks/opstest/recipes に移動します。

    注記

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

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

    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 を何度でも実行できます。コマンドを実行するたびにインスタンスを停止および再開する必要はありません。レシピが正常に動作していることを確認できたら、ソースクックブックのコードも必ず更新してください。

注記

AWS OpsWorks スタックによって自動的に実行されるようにレシピをライフサイクルイベントに割り当てている場合は、常に Execute Recipe を使用してレシピを再実行できます。また、AWS OpsWorks スタックコンソールで適切なイベントを手動でトリガーしてインスタンスを再開しなくても、レシピを何度でも再実行できます。ただしこのアプローチでは、イベントのすべてのレシピが実行されます。次の点に注意してください。