例 8: 管理サービス - AWS OpsWorks

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

例 8: 管理サービス

重要

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

通常、アプリケーションサーバーなどのパッケージには、開始、停止、再起動などを行う必要がある関連サービスがあります。たとえばパッケージをインストールしたりインスタンスの起動が完了した後は Tomcat サービスを開始する必要があり、また設定ファイルを変更するたびにこのサービスを再起動する必要があります。このトピックでは、例として Tomcat アプリケーションサーバーを使用し、Linux インスタンスでのサービスの管理方法の基礎を説明します。サービスリソースは、詳細に多少の違いはあるものの、多くの Windows インスタンスで同じように動作します。詳細については、「service」を参照してください。

注記

例では、Tomcat のインストールを必要最小限にして service リソースの使用方法の基礎を提示します。より機能的な Tomcat サーバーのレシピを実行する方法の例は、「カスタム Tomcat サーバーレイヤーの作成」を参照してください。

サービスの定義と起動

このセクションでは、サービスの定義と起動方法を説明します。

開始するには、以下の手順を実行します。
  1. opsworks_cookbooks ディレクトリ内に tomcat という名前のディレクトリを作成し、そのディレクトリに移動します。

  2. tomcat に、次のコンテンツを含む metadata.rb ファイルを追加します。

    name "tomcat" version "0.1.0"
  3. 例 1: パッケージのインストール」の説明に従って Test Kitchen を初期化し設定して、platforms リストから CentOS を削除します。

  4. tomcatrecipes サブディレクトリを追加します。

service リソースを使ってサービスを管理します。以下のデフォルトのレシピは Tomcat をインストールしサービスを起動します。

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.rbtomcat を参照してサービスを開始します。

  • service_name リソースは サービス名を指定します。

    インスタンスでサービスをリストする場合は、Tomcat サービスは tomcat7 という名前になります。

  • supports は Chef がサービスのrestartreload、および status コマンドを管理する方法を指定します。

    • true は、Chef が init またはその他のサービスプロバイダーを使用してコマンドを実行できることを示します。

    • false は、Chef がその他の方法でコマンドの実行を試みる必要があることを示します。

action:nothing に設定され、リソースにアクションを取らないよう指示していることに注意してください。サービスリソースはもちろん startrestart などのアクションをサポートしています。ただし、このクックブックではサービス定義を使用する標準的な手法をとっており、どこにあるサービスであってもアクションをとらずに開始または再起動を行います。サービスを開始または再起動するレシピはまずそれを定義します。したがって最もシンプルな方法は、サービス定義を別のレシピに配置して必要に応じてそれを他のレシピにも含めることです。

注記

わかりやすいように、この例のデフォルトのレシピでは service リソースを使用してサービス定義を実行した後にサービスを開始します。本番の実装では通常、後述のように notifies を使用してサービスを開始または再開します。

レシピを実行するには
  1. デフォルトのレシピ例を含む default.rb ファイルを作成して、recipes に保存します。

  2. サービス定義の例を含む service.rb ファイルを作成し、recipes に保存します。

  3. kitchen converge を実行し、その後インスタンスにログインします。以下のコマンドを実行し、サービスが実行中であることを確認します。

    sudo service tomcat7 status
注記

service.rbdefault.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 レシピ」を参照してください。

クックブックをセットアップするには
  1. templates サブディレクトリを tomcat に、default サブディレクトリを templates に追加します。

  2. example_data.json.erb クックブックから createfile テンプレートを templates/default ディレクトリへコピーします。

  3. attributestomcat サブディレクトリを追加します。

  4. 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 が最初にインストールされた時および設定が変更されるたびに再起動した時に、確実にサービスが開始されます。

レシピを実行するには
  1. kitchen destroy を実行して新しいインスタンスで始められるようにします。

  2. default.rb のコードを前述の例で置き換えます。

  3. 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 を実行することでこの要件を回避しています。これは単純に成功コードを返すだけのシェルコマンドです。