ステップ 3: カスタムクックブックの作成およびデプロイする - AWS OpsWorks

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

ステップ 3: カスタムクックブックの作成およびデプロイする

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

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

このファイルをサーバーに手動でコピーすることもできますが、このファイルを生成する Chef レシピを実装し、AWS OpsWorks スタックによってすべてのサーバーでレシピが実行されるようにする方法をお勧めします。Chef レシピは、AWS OpsWorks スタックがインスタンスでタスク (パッケージのインストールや設定ファイルの作成など) を実行するために使用する特殊な Ruby アプリケーションです。レシピはクックブックにパッケージ化されます。クックブックには、複数のレシピと関連ファイル (設定ファイルのテンプレートなど) を含めることができます。クックブックは GitHub などのリポジトリに配置されます。クックブックには標準のディレクトリ構造が必要です。カスタムクックブックリポジトリがまだない場合、これをセットアップする方法の詳細については、「クックブックリポジトリ」を参照してください。

この例では、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

このレシピは、AWS OpsWorks スタックのスタック設定およびデプロイメント JSON オブジェクトのデータによって異なります。各インスタンスにインストールされるこのオブジェクトには、スタックとデプロイするすべてのアプリケーションの詳細情報が含まれています。このオブジェクトの deploy ノードの構造は次のとおりです。

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

deploy ノードには、デプロイする各アプリケーションに対応し、そのアプリケーションの短縮名が付けられた一連の埋め込み JSON オブジェクトが含まれます。各アプリケーションオブジェクトには、アプリケーションの設定 (ドキュメントのルートやアプリケーションタイプなど) を定義する一連の属性が含まれます。deploy 属性のリストについては、「deploy 属性」を参照してください。レシピでは、Chef の属性構文を使用して、スタック設定およびデプロイメント JSON の値を表すことができます。たとえば、[:deploy][:app1][:application] は、app1 アプリケーションの短縮名を表します。

[:deploy] の各アプリケーションでは、レシピによって関連するコードブロックが実行されます。コードブロックでは、deploy_config がアプリケーション属性を表します。レシピでは、まず app_root をアプリケーションのルートディレクトリ [:deploy][:app_name][:deploy_to]/current に設定します。次に、Chef のテンプレートリソースを使用して 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 リソースは、次のように機能します。

  • sourcecookbook は、それぞれテンプレート名とクックブック名を指定します。

  • modegroup、および owner は、設定ファイルにアプリケーションと同じアクセス権を与えます。

  • variables セクションでは、テンプレートで使用する @redis 変数をアプリケーションの [:redis] 属性値に設定します。

    [:redis] 属性の値は、後述するカスタム JSON を使用して設定されます。これは、アプリケーションの標準属性ではありません。

  • not_if ディレクティブは、設定ファイルがすでに存在する場合にレシピで設定ファイルを生成しないことを示します。

クックブックを作成したら、各インスタンスのクックブックキャッシュにデプロイする必要があります。このオペレーションではレシピは実行されません。スタックのインスタンスに新しいクックブックをインストールするだけです。後述するように、通常は Layer のライフサイクルイベントにレシピを割り当てることによってレシピを実行します。

カスタムクックブックをデプロイするには

  1. AWS OpsWorks スタックの [Stack] ページで、[Stack Settings]、[Edit] の順にクリックします。

  2. [Configuration Management] セクションで、[Use custom Chef cookbooks] を [Yes] に設定し、クックブックリポジトリの情報を入力します。次に、[Save] をクリックしてスタック設定を更新します。

  3. [Stack] ページで [Run Command] をクリックし、[Update Custom Cookbooks] スタックコマンドを選択します。次に、[Update Custom Cookbooks] をクリックして、インスタンスのクックブックキャッシュに新しいクックブックをインストールします。

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