Chef 11.4 スタック用のレシピの実装 - AWS OpsWorks

Chef 11.4 スタック用のレシピの実装

重要

カスタムクックブックまたはコミュニティクックブックに組み込みクックブックの名前を再使用しないでください。組込クックブックと同じ名前のカスタムクックブックは失敗する可能性があります。Chef 11.10、11.4、0.9 のスタックで使用可能な組み込みクックブックの完全なリストについては、「GitHub の opsworks-cookbooks リポジトリ」を参照してください。

Chef 11.4 スタックの大きな制限は、レシピで Chef の検索やデータバッグを使用できないことです。ただし、AWS OpsWorks スタックはスタック設定およびデプロイ属性を各インスタンスにインストールしますが、これには次のように検索で取得できる情報の多くが含まれています。

  • ホストまたはアプリケーション名など、コンソールからのユーザー定義のデータ。

  • スタックのレイヤー、アプリケーション、インスタンスなど、AWS OpsWorks スタックサービスによって生成されたスタック設定データ、および IP アドレスなどの各インスタンスに関する詳細。

  • ユーザーによって提供されたデータを含み、データバッグとほぼ同じ目的で使用できる、カスタム JSON 属性。

AWS OpsWorks スタックは、スタック設定およびデプロイ属性の最新バージョンを、各ライフサイクルイベントについて、イベントの Chef の実行が開始される前に、各インスタンスにインストールします。データは、標準の node[:attribute][:child_attribute][...] 構文を通じてレシピに使用できます。たとえば、スタック設定およびデプロイ属性にはスタック名 node[:opsworks][:stack][:name] が含まれています。

組み込みのレシピの 1 つに含まれる次のコードは、スタック名を取得し、その名前を使用して設定ファイルを作成します。

template '/etc/ganglia/gmetad.conf' do source 'gmetad.conf.erb' mode '0644' variables :stack_name => node[:opsworks][:stack][:name] notifies :restart, "service[gmetad]" end

スタック設定およびデプロイ属性の値の多くには、複数の属性が含まれています。必要な情報を取得するために、これらの属性を反復処理する必要があります。以下の例は、スタック設定およびデプロイ属性からの引用を示しています。便宜上、JSON オブジェクトとしてあらわされています。これには、最上位属性 deploy が含まれています。この最上位属性には、スタックの各アプリケーションの属性が含まれており、アプリケーションの短縮名が付いています。

{ ... "deploy": { "app1_shortname": { "document_root": "app1_root", "deploy_to": "deploy_directory", "application_type": "php", ... }, "app2_shortname": { "document_root": "app2_root", ... } }, ... }

各アプリケーション属性には、アプリケーションの特性を示す一連の属性が含まれています。たとえば、deploy_to 属性は、アプリケーションのデプロイディレクトリを表します。次のコードは、アプリケーションの各デプロイディレクトリのユーザー、グループ、およびパスを設定します。

node[:deploy].each do |application, deploy| opsworks_deploy_dir do user deploy[:user] group deploy[:group] path deploy[:deploy_to] end ... end

スタック設定およびデプロイ属性の詳細については、「AWS OpsWorks スタックのカスタマイズ」を参照してください。デプロイディレクトリの詳細については、「Deploy レシピ」を参照してください。

Chef 11.4 のスタックはデータバッグをサポートしていませんが、カスタム JSON を指定することによって、スタック設定およびデプロイ属性に任意のデータを追加できます。レシピは、標準的な Chef のノード構文を使用して、データにアクセスできます。詳細については、「カスタム JSON の使用」を参照してください。

暗号化されたデータバッグの機能が必要な場合は、選択肢の 1 つとして、プライベート Amazon S3 バケットなどの安全な場所に機密性の高い属性を保存する方法があります。レシピでは、AWS Ruby SDK — すべての AWS OpsWorks スタックインスタンスにインストールされている — を使用して、バケットからデータをダウンロードすることができます。

注記

各 AWS OpsWorks スタックインスタンスにはインスタンスプロファイルがあります。関連付けられた IAM ロールによって、インスタンスで実行中のアプリケーションがどの AWS リソースにアクセスできるかが指定されます。レシピで Amazon S3 バケットにアクセスするには、ロールのポリシーに次のようなステートメントを含めて、指定されたバケットからファイルを取得するアクセス許可を付与する必要があります。

"Action": ["s3:GetObject"], "Effect": "Allow", "Resource": "arn:aws:s3:::yourbucketname/*",

インスタンスプロファイルの詳細については、「EC2 インスタンスで実行するアプリケーションに対するアクセス許可の指定」を参照してください。