翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
例 8: 管理サービス
重要
- AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、 にお問い合わせください。 AWS Support でのチーム AWS re:Post
通常、アプリケーションサーバーなどのパッケージには、開始、停止、再起動などを行う必要がある関連サービスがあります。たとえばパッケージをインストールしたりインスタンスの起動が完了した後は Tomcat サービスを開始する必要があり、また設定ファイルを変更するたびにこのサービスを再起動する必要があります。このトピックでは、例として Tomcat アプリケーションサーバーを使用し、Linux インスタンスでのサービスの管理方法の基礎を説明します。サービスリソースは、詳細に多少の違いはあるものの、多くの Windows インスタンスで同じように動作します。詳細については、「service
注記
例では、Tomcat のインストールを必要最小限にして service
リソースの使用方法の基礎を提示します。より機能的な Tomcat サーバーのレシピを実行する方法の例は、「カスタム Tomcat サーバーレイヤーの作成」を参照してください。
サービスの定義と起動
このセクションでは、サービスの定義と起動方法を説明します。
開始するには、以下の手順を実行します。
-
opsworks_cookbooks
ディレクトリ内にtomcat
という名前のディレクトリを作成し、そのディレクトリに移動します。 -
tomcat
に、次のコンテンツを含むmetadata.rb
ファイルを追加します。name "tomcat" version "0.1.0"
-
「例 1: パッケージのインストール」の説明に従って Test Kitchen を初期化し設定して、
platforms
リストから CentOS を削除します。 -
tomcat
にrecipes
サブディレクトリを追加します。
service
execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :start end
このレシピでは、以下のような処理を実行します。
-
execute
リソースはapt-get update
を実行して現在のシステム更新をインストールします。この例で使用されている Ubuntu のインスタンスでは、Tomcat をインストールする前に更新をインストールする必要があります。その他のシステムでは異なる要件がある場合があります。
-
package
リソースは Tomcat 7 をインストールします。 -
中に含まれる
tomcat::service
レシピはサービスを定義します。説明は後述します。 -
service
リソースは Tomcat サービスを開始します。このリソースでサービスの停止や再起動などの他のコマンドを発行することもできます。
以下の例で tomcat::service
レシピを説明します。
service 'tomcat' do service_name "tomcat7" supports :restart => true, :reload => false, :status => true action :nothing end
レシピは、Tomcat サービスの定義を以下のように作成します。
-
リソース名
tomcat
は他のレシピがサービスを参照するために使用されます。例えば、
default.rb
はtomcat
を参照してサービスを開始します。 -
service_name
リソースは サービス名を指定します。インスタンスでサービスをリストする場合は、Tomcat サービスは tomcat7 という名前になります。
-
supports
は Chef がサービスのrestart
、reload
、およびstatus
コマンドを管理する方法を指定します。-
true
は、Chef が init またはその他のサービスプロバイダーを使用してコマンドを実行できることを示します。 -
false
は、Chef がその他の方法でコマンドの実行を試みる必要があることを示します。
-
action
が :nothing
に設定され、リソースにアクションを取らないよう指示していることに注意してください。サービスリソースはもちろん start
や restart
などのアクションをサポートしています。ただし、このクックブックではサービス定義を使用する標準的な手法をとっており、どこにあるサービスであってもアクションをとらずに開始または再起動を行います。サービスを開始または再起動するレシピはまずそれを定義します。したがって最もシンプルな方法は、サービス定義を別のレシピに配置して必要に応じてそれを他のレシピにも含めることです。
注記
わかりやすいように、この例のデフォルトのレシピでは service
リソースを使用してサービス定義を実行した後にサービスを開始します。本番の実装では通常、後述のように notifies
を使用してサービスを開始または再開します。
レシピを実行するには
-
デフォルトのレシピ例を含む
default.rb
ファイルを作成して、recipes
に保存します。 -
サービス定義の例を含む
service.rb
ファイルを作成し、recipes
に保存します。 -
kitchen converge
を実行し、その後インスタンスにログインします。以下のコマンドを実行し、サービスが実行中であることを確認します。sudo service tomcat7 status
注記
service.rb
を default.rb
とは別に実行した場合、.kitchen.yml
を編集して実行リストに tomcat::service
を追加する必要がある場合があります。ただしレシピを含む場合は、コードはレシピが実行される前に親レシピに組み込まれます。したがって service.rb
は基本的に default.rb
の一部であり、あらためて実行リストに追加する必要ではありません。
通知を使用したサービスの開始または再起動
本番の実装では、サービスの開始や再起動に通常は service
は使用しません。代わりに、notifies
を任意のリソースに追加します。例えば、設定ファイルを変更した後サービスを再起動する場合、notifies
を関連する template
リソースに含めます。notifies
を使用すると、service
リソースを使用した明示的なサービスの再起動に対して以下の利点があります。
-
notifies
要素は、関連する設定ファイルが変更された場合にのみサービスを再起動するので、必要のない時にサービスが再起動されるリスクを避けられます。 -
Chef は、実行されるサービスに含まれる
notifies
の数に関係なく、各実行の最後に必要に応じて 1 度だけサービスを再起動します。たとえば、Chef の実行に含まれる複数のテンプレートリソースがそれぞれ異なる設定ファイルを変更し、ファイルが変更された場合にはサービスの再起動を要求する可能性があります。しかし、サービスの再起動は Chef の実行の最後に 1 度だけにしたいものでしょう。そうしないと、先の再起動からまだ完全に機能が立ち上がらないうちにまたサービスを再起動することになり、エラーが発生する可能性があります。
この例では tomcat::default
を変更して、template
を使用してサービスを再起動する notifies
リソースを含めます。実際の例では、テンプレートリソースを使用して Tomcat 設定ファイルの 1 つをカスタマイズしたバージョンを作成しますが、それは非常に長く複雑なものになります。わかりやすいように、例では「テンプレートからのファイルの作成」のテンプレートリソースを使用します。Tomcat とは関係ありませんが、notifies
の使用方法をわかりやすく説明できます。テンプレートを使用して Tomcat の設定ファイルを作成する方法の例は、「Setup レシピ」を参照してください。
クックブックをセットアップするには
-
templates
サブディレクトリをtomcat
に、default
サブディレクトリをtemplates
に追加します。 -
example_data.json.erb
クックブックからcreatefile
テンプレートをtemplates/default
ディレクトリへコピーします。 -
attributes
にtomcat
サブディレクトリを追加します。 -
default.rb
クックブックからcreatefile
属性ファイルをattributes
ディレクトリへコピーします。
以下のレシピは notifies
を使用して Tomcat サービスを再起動します。
execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :enable end directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end template "/srv/www/shared/example_data.json" do source "example_data.json.erb" mode 0644 variables( :a_boolean_var => true, :a_string_var => "some string" ) only_if {node['createfile']['install_file']} notifies :restart, resources(:service => 'tomcat') end
この例は、「テンプレートからのファイルの作成」のレシピを前述のセクションのレシピにマージします。2 つの大幅な変更があります。
-
service
リソースは依然として同じ場所にありますが、別の用途で使用されます。:enable
アクションで、起動時に Tomcat サービスが有効になります。 -
これでテンプレートリソースに
notifies
が含まれ、example_data.json
が変更された場合には Tomcat サービスを再起動します。これで、Tomcat が最初にインストールされた時および設定が変更されるたびに再起動した時に、確実にサービスが開始されます。
レシピを実行するには
-
kitchen destroy
を実行して新しいインスタンスで始められるようにします。 -
default.rb
のコードを前述の例で置き換えます。 -
kitchen converge
を実行し、その後インスタンスにログインしてサービスが実行中であることを確認します。
注記
サービスを再起動したいがレシピに template
をサポートする notifies
などのリソースが含まれていない場合、代わりにダミーの execute
リソースを使用できます。例
execute 'trigger tomcat service restart' do command 'bin/true' notifies :restart, resources(:service => 'tomcat') end
execute
リソースには、command
を実行する手段としてのみリソースを使用している場合でも、notifies
属性が必要です。この例では、/bin/true
を実行することでこの要件を回避しています。これは単純に成功コードを返すだけのシェルコマンドです。