

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

# 例 8: 管理サービス
<a name="cookbooks-101-basics-services"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](https://aws.amazon.com/support)を通じて AWS サポート チームにお問い合わせください。

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

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

**Topics**
+ [サービスの定義と起動](#cookbooks-101-basics-services-service)
+ [通知を使用したサービスの開始または再起動](#cookbooks-101-basics-services-notifies)

## サービスの定義と起動
<a name="cookbooks-101-basics-services-service"></a>

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

**開始するには、以下の手順を実行します。**

1. `opsworks_cookbooks` ディレクトリ内に `tomcat` という名前のディレクトリを作成し、そのディレクトリに移動します。

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

   ```
   name "tomcat"
   version "0.1.0"
   ```

1. 「[例 1: パッケージのインストール](cookbooks-101-basics-packages.md)」の説明に従って Test Kitchen を初期化し設定して、`platforms` リストから CentOS を削除します。

1. `tomcat` に `recipes` サブディレクトリを追加します。

[https://docs.chef.io/chef/resources.html#service](https://docs.chef.io/chef/resources.html#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.rb` は `tomcat` を参照してサービスを開始します。
+ `service_name` リソースは サービス名を指定します。

  インスタンスでサービスをリストする場合は、Tomcat サービスは tomcat7 という名前になります。
+ `supports` は Chef がサービスの`restart`、`reload`、および `status` コマンドを管理する方法を指定します。
  + `true` は、Chef が init またはその他のサービスプロバイダーを使用してコマンドを実行できることを示します。
  + `false` は、Chef がその他の方法でコマンドの実行を試みる必要があることを示します。

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

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

**レシピを実行するには**

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

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

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

   ```
   sudo service tomcat7 status
   ```

**注記**  
`service.rb` を `default.rb` とは別に実行した場合、`.kitchen.yml` を編集して実行リストに `tomcat::service` を追加する必要がある場合があります。ただしレシピを含む場合は、コードはレシピが実行される前に親レシピに組み込まれます。したがって `service.rb` は基本的に `default.rb` の一部であり、あらためて実行リストに追加する必要ではありません。

## 通知を使用したサービスの開始または再起動
<a name="cookbooks-101-basics-services-notifies"></a>

本番の実装では、サービスの開始や再起動に通常は `service` は使用しません。代わりに、`notifies` を任意のリソースに追加します。例えば、設定ファイルを変更した後サービスを再起動する場合、`notifies` を関連する `template` リソースに含めます。`notifies` を使用すると、`service` リソースを使用した明示的なサービスの再起動に対して以下の利点があります。
+ `notifies` 要素は、関連する設定ファイルが変更された場合にのみサービスを再起動するので、必要のない時にサービスが再起動されるリスクを避けられます。
+ Chef は、実行されるサービスに含まれる `notifies` の数に関係なく、各実行の最後に必要に応じて 1 度だけサービスを再起動します。

  たとえば、Chef の実行に含まれる複数のテンプレートリソースがそれぞれ異なる設定ファイルを変更し、ファイルが変更された場合にはサービスの再起動を要求する可能性があります。しかし、サービスの再起動は Chef の実行の最後に 1 度だけにしたいものでしょう。そうしないと、先の再起動からまだ完全に機能が立ち上がらないうちにまたサービスを再起動することになり、エラーが発生する可能性があります。

この例では `tomcat::default` を変更して、`template` を使用してサービスを再起動する `notifies` リソースを含めます。実際の例では、テンプレートリソースを使用して Tomcat 設定ファイルの 1 つをカスタマイズしたバージョンを作成しますが、それは非常に長く複雑なものになります。わかりやすいように、例では「[テンプレートからのファイルの作成](cookbooks-101-basics-files.md#cookbooks-101-basics-files-template)」のテンプレートリソースを使用します。Tomcat とは関係ありませんが、`notifies` の使用方法をわかりやすく説明できます。テンプレートを使用して Tomcat の設定ファイルを作成する方法の例は、「[Setup レシピ](create-custom-setup.md)」を参照してください。

**クックブックをセットアップするには**

1. `templates` サブディレクトリを `tomcat` に、`default` サブディレクトリを `templates` に追加します。

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

1. `attributes` に `tomcat` サブディレクトリを追加します。

1. `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
```

この例は、「[テンプレートからのファイルの作成](cookbooks-101-basics-files.md#cookbooks-101-basics-files-template)」のレシピを前述のセクションのレシピにマージします。2 つの大幅な変更があります。
+ `service` リソースは依然として同じ場所にありますが、別の用途で使用されます。

  `:enable` アクションで、起動時に Tomcat サービスが有効になります。
+ これでテンプレートリソースに `notifies` が含まれ、`example_data.json` が変更された場合には Tomcat サービスを再起動します。

  これで、Tomcat が最初にインストールされた時および設定が変更されるたびに再起動した時に、確実にサービスが開始されます。

**レシピを実行するには**

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

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

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