

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

# Setup レシピ
<a name="create-custom-setup"></a>

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

Setup レシピは、レイヤーの Setup [ライフサイクル](workingcookbook-events.md)イベントに割り当てられ、インスタンスの起動後に実行されます。このレシピは、パッケージのインストール、設定ファイルの作成、サービスの開始などのタスクを実行します。Setup レシピの実行が完了すると、 OpsWorks Stacks は [Deploy レシピ](create-custom-deploy.md)を実行して、新しいインスタンスにアプリケーションをデプロイします。

**Topics**
+ [tomcat::setup](#create-custom-setup-setup)
+ [tomcat::install](#create-custom-setup-install)
+ [tomcat::service](#create-custom-setup-service)
+ [tomcat::container\$1config](#create-custom-setup-config)
+ [tomcat::apache\$1tomcat\$1bind](#create-custom-setup-bind)

## tomcat::setup
<a name="create-custom-setup-setup"></a>

`tomcat::setup` レシピは、レイヤーの Setup ライフサイクルイベントに割り当てられます。

```
include_recipe 'tomcat::install'
include_recipe 'tomcat::service'

service 'tomcat' do
  action :enable
end

# for EBS-backed instances we rely on autofs
bash '(re-)start autofs earlier' do
  user 'root'
  code <<-EOC
    service autofs restart
  EOC
  notifies :restart, resources(:service => 'tomcat')
end

include_recipe 'tomcat::container_config'
include_recipe 'apache2'
include_recipe 'tomcat::apache_tomcat_bind'
```

`tomcat::setup` レシピは、主としてメタレシピです。Tomcat および関連パッケージのインストールと設定の詳細のほとんどを処理する一連の依存レシピが含まれています。`tomcat::setup` の最初の部分は、後で説明する次のレシピを実行します。
+ [tomcat::install](#create-custom-setup-install) レシピは、Tomcat サーバーパッケージをインストールします。
+ [tomcat::service](#create-custom-setup-service) レシピは、Tomcat サービスをセットアップします。

`tomcat::setup` の中央部分は、Tomcat サービスを有効にして起動します。
+ Chef [service リソース](https://docs.chef.io/chef/resources.html#service)は、Tomcat サービスを起動時に有効にします。
+ Chef [bash resource](https://docs.chef.io/chef/resources.html#bash) (bash リソース) は、Bash スクリプトを実行して autofs デーモンを起動します。これは、Amazon EBS-backed インスタンスに必要です。次に、このリソースは、Tomcatサービスの再起動を `service` リソースに通知します。

  詳細については、「[autofs](https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s2-nfs-config-autofs.html)」(Amazon Linux の場合) または「[Autofs](https://help.ubuntu.com/community/Autofs)」(Ubuntu の場合) を参照してください。

`tomcat::setup` の最後の部分は、設定ファイルを作成し、フロントエンド Apache サーバーをインストールおよび設定します。
+ [tomcat::container\$1config](#create-custom-setup-config) レシピは、設定ファイルを作成します。
+ `apache2` レシピ ( の略称`apache2::default`) は、Apache サーバーをインストールして設定する OpsWorks スタックの組み込みレシピです。
+ [tomcat::apache\$1tomcat\$1bind](#create-custom-setup-bind) レシピは、Tomcat サーバーのフロントエンドとして機能するように Apache サーバーを設定します。

**注記**  
組み込みのレシピを使用して必要なタスクの一部を実行することにより、多くの場合、時間と労力を削減できます。このレシピは、組み込みの `apache2::default` レシピを使用することで、Apache を最初から実装する必要なくインストールします。組み込みのレシピを使用するその他の例については、「[Deploy レシピ](create-custom-deploy.md)」を参照してください。

以下のセクションでは、Tomcat クックブックの Setup レシピについてさらに詳しく説明します。`apache2` レシピの詳細については、「[opsworks-cookbooks/apache2](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.4/apache2)」を参照してください。

## tomcat::install
<a name="create-custom-setup-install"></a>

`tomcat::install ` レシピは、Tomcat サーバー、OpenJDK、および Java コネクターライブラリをインストールします。Java コネクターライブラリは、MySQL サーバーへの接続を処理します。

```
tomcat_pkgs = value_for_platform(
  ['debian', 'ubuntu'] => {
    'default' => ["tomcat#{node['tomcat']['base_version']}", 'libtcnative-1', 'libmysql-java']
  },
  ['centos', 'redhat', 'fedora', 'amazon'] => {
    'default' => ["tomcat#{node['tomcat']['base_version']}", 'tomcat-native', 'mysql-connector-java']
  },
  'default' => ["tomcat#{node['tomcat']['base_version']}"]
)

tomcat_pkgs.each do |pkg|
  package pkg do
    action :install
  end
end

link ::File.join(node['tomcat']['lib_dir'], node['tomcat']['mysql_connector_jar']) do
  to ::File.join(node['tomcat']['java_dir'], node['tomcat']['mysql_connector_jar'])
  action :create
end

# remove the ROOT webapp, if it got installed by default
include_recipe 'tomcat::remove_root_webapp'
```

このレシピは、次のタスクを実行します。

1. インスタンスのオペレーティングシステムに応じて、インストールするパッケージのリストを作成します。

1. リストに各パッケージをインストールします。

   Chef [package resource](https://docs.chef.io/chef/resources.html#id146) (パッケージリソース) は適切なプロバイダを使用します。`yum` Amazon Linux および `apt-get` Ubuntu の場合— インストールを処理します。package プロバイダーは、Tomcat の依存関係として OpenJDK をインストールしますが、MySQL コネクターライブラリは明示的にインストールする必要があります。

1. Chef [link リソース](https://docs.chef.io/chef/resources.html#link)を使用して、Tomcat サーバーの lib ディレクトリに JDK の MySQL コネクターライブラリへのシンボリックリンクを作成します。

   デフォルトの属性値を使用すると、Tomcat の lib ディレクトリは `/usr/share/tomcat6/lib` となり、MySQL コネクターライブラリ (`mysql-connector-java.jar`) は `/usr/share/java/` にあります。

`tomcat::remove_root_webapp` レシピは、ROOT ウェブアプリケーション (デフォルトでは `/var/lib/tomcat6/webapps/ROOT`) を削除して、セキュリティの問題のいくつかを回避します。

```
ruby_block 'remove the ROOT webapp' do
  block do
    ::FileUtils.rm_rf(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT'), :secure => true)
  end
  only_if { ::File.exists?(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT')) && !::File.symlink?(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT')) }
end
```

`only_if` ステートメントにより、このレシピは、ファイルが存在する場合にのみファイルを削除します。

**注記**  
Tomcat のバージョンは、`['tomcat']['base_version']` 属性で指定されます。この属性ファイルでは 6 に設定されています。Tomcat 7 をインストールする場合は、この属性を上書きするためにカスタム JSON 属性を使用できます。[スタックの設定を編集](workingstacks-edit.md)し、次の JSON を、[**Custom Chef JSON**] ボックスに入力するか既存のカスタム JSON に追加します。  

```
{
  'tomcat' : {
    'base_version' : 7
  }
}
```
このカスタム JSON 属性により、デフォルトの属性が上書きされ、Tomcat のバージョンが 7 に設定されます。属性の上書きの詳細については、「[属性の上書き](workingcookbook-attributes.md)」を参照してください。

## tomcat::service
<a name="create-custom-setup-service"></a>

`tomcat::service` レシピは、Tomcat サービスの定義を作成します。

```
service 'tomcat' do
  service_name "tomcat#{node['tomcat']['base_version']}"

  case node[:platform]
  when 'centos', 'redhat', 'fedora', 'amazon'
    supports :restart => true, :reload => true, :status => true
  when 'debian', 'ubuntu'
    supports :restart => true, :reload => false, :status => true
  end

  action :nothing
end
```

このレシピは、Chef [service リソース](https://docs.chef.io/chef/resources.html#service)を使用して Tomcat サービス名 (デフォルトでは tomcat6) を指定し、`supports` 属性を設定して、さまざまなオペレーティングシステムでサービスの restart コマンド、reload コマンド、および status コマンドを Chef によって管理する方法を定義します。
+ `true` は、Chef が init またはその他のサービスプロバイダーを使用してコマンドを実行できることを示します。
+ `false` は、Chef がその他の方法でコマンドの実行を試みる必要があることを示します。

`action` が `:nothing` に設定されていることに注意してください。ライフサイクルイベントごとに、 OpsWorks スタックは [Chef 実行](https://docs.chef.io/chef_client_overview.html#the-chef-client-run)を開始し、適切なレシピセットを実行します。Tomcat クックブックは、レシピでサービスの定義を作成するがサービスの再起動はしないという一般的なパターンに従います。Chef 実行のその他のレシピは、通常、設定ファイルの作成に使用する `notifies` リソースに `template` コマンドを含めることで、再起動を処理します。通知を使用すると、設定が変更された場合にのみサービスが再起動されるため、通知はサービスの再起動のための便利な方法です。また、Chef 実行で 1 つのサービスに対して複数の再起動通知がある場合、Chef は最大で 1 回サービスを再起動します。これにより、Tomcat のエラーの一般的原因である、完全には機能していないサービスを再起動しようとする際に発生する可能性がある問題が回避されます。

 Tomcat サービスは、再起動通知を使用する任意の Chef 実行に対して定義する必要があります。したがって、`tomcat::service` は複数のレシピに含まれ、それぞれの Chef 実行に対してサービスが定義されることになります。Chef 実行に `tomcat::service` の複数のインスタンスが含まれる場合のペナルティはありません。これは、Chef ではレシピの実行回数が Chef 実行ごとに 1 回のみであるためです。

## tomcat::container\$1config
<a name="create-custom-setup-config"></a>

`tomcat::container_config` レシピは、クックブックテンプレートファイルから設定ファイルを作成します。

```
include_recipe 'tomcat::service'

template 'tomcat environment configuration' do
  path ::File.join(node['tomcat']['system_env_dir'], "tomcat#{node['tomcat']['base_version']}")
  source 'tomcat_env_config.erb'
  owner 'root'
  group 'root'
  mode 0644
  backup false
  notifies :restart, resources(:service => 'tomcat')
end

template 'tomcat server configuration' do
  path ::File.join(node['tomcat']['catalina_base_dir'], 'server.xml')
  source 'server.xml.erb'
  owner 'root'
  group 'root'
  mode 0644
  backup false
  notifies :restart, resources(:service => 'tomcat')
end
```

このレシピは、必要に応じてサービスを定義する `tomcat::service` を最初に呼び出します。このレシピの大部分は、2 つの [template resources](https://docs.chef.io/chef/resources.html#template) で構成され、クックブックのいずれかのテンプレートファイルから設定ファイルを作成し、ファイルのプロパティを設定し、Chef にサービスを再起動するよう通知します。

### Tomcat 環境設定
<a name="create-custom-setup-config-env"></a>

最初の `template` リソースは、`tomcat_env_config.erb` テンプレートファイルを使用して Tomcat 環境設定ファイルを作成します。このファイルは、`JAVA_HOME` などの環境変数の設定に使用します。デフォルトのファイル名は、`template` リソースの引数です。`tomcat::container_config` は、`path` 属性を使用し、デフォルト値を上書きして設定ファイルに `/etc/sysconfig/tomcat6` (Amazon Linux の場合) または `/etc/default/tomcat6` (Ubuntu の場合) の名前を付けます。また、`template` リソースは、ファイルの所有者、グループ、およびモードの設定を指定し、バックアップファイルを作成しないように Chef に指示します。

ソースコードを確認すると、実際には 3 つのバージョンの `tomcat_env_config.erb` が存在し、それぞれ `templates` ディレクトリの異なるサブディレクトリ内にあります。`ubuntu` ディレクトリおよび `amazon` ディレクトリには、それぞれのオペレーティングシステムに対応するテンプレートが含まれます。`default` フォルダには、1 行のコメント行があるダミーのテンプレートが含まれています。このテンプレートは、サポートされていないオペレーティング システムを使用するインスタンスでこのレシピを実行しようとした場合にのみ使用されます。`tomcat::container_config` レシピでは、使用する `tomcat_env_config.erb` を指定する必要はありません。Chef は、「[File Specificity](http://docs.chef.io/templates.html#file-specificity)」で説明されているルールに基づいて、インスタンスのオペレーティングシステム用の適切なディレクトリを自動的に選択します。

この例の `tomcat_env_config.erb` ファイルは、大部分がコメントで構成されています。追加の環境変数を設定するには、適切な行をコメント解除し、新しい値を指定します。

**注記**  
変更する可能性がある設定は、テンプレートにハードコーディングするのではなく、属性として定義する必要があります。そうすれば、設定を変更するためにテンプレートを書き直す必要はなく、属性を上書きするだけで済みます。

次の抜粋に示すように、Amazon Linux テンプレートは 1 つの環境変数のみを設定します。

```
...
# Use JAVA_OPTS to set java.library.path for libtcnative.so
#JAVA_OPTS="-Djava.library.path=/usr/lib"

JAVA_OPTS="${JAVA_OPTS} <%= node['tomcat']['java_opts'] %>"

# What user should run tomcat
#TOMCAT_USER="tomcat"
...
```

JAVA\$1OPTS を使用すると、ライブラリのパスなどの Java オプションを指定できます。デフォルトの属性値を使用すると、このテンプレートは Amazon Linux の Java オプションを設定しません。例えば、カスタム JSON 属性を使用して、`['tomcat']['java_opts']` 属性を上書きすることにより、独自の Java オプションを設定できます。例については、[スタックの作成](create-custom-stack.md#create-custom-stack-stack)を参照してください。

次のテンプレートの抜粋に示すように、Ubuntu テンプレートは複数の環境変数を設定します。

```
# Run Tomcat as this user ID. Not setting this or leaving it blank will use the
# default of tomcat<%= node['tomcat']['base_version'] %>.
TOMCAT<%= node['tomcat']['base_version'] %>_USER=tomcat<%= node['tomcat']['base_version'] %>
...
# Run Tomcat as this group ID. Not setting this or leaving it blank will use
# the default of tomcat<%= node['tomcat']['base_version'] %>.
TOMCAT<%= node['tomcat']['base_version'] %>_GROUP=tomcat<%= node['tomcat']['base_version'] %>
...
JAVA_OPTS="<%= node['tomcat']['java_opts'] %>"

<% if node['tomcat']['base_version'].to_i < 7 -%>
# Unset LC_ALL to prevent user environment executing the init script from
# influencing servlet behavior.  See Debian bug #645221
unset LC_ALL
<% end -%>
```

デフォルトの属性値を使用すると、このテンプレートは次のように Ubuntu 環境変数を設定します。
+ Tomcat のユーザーとグループを表す `TOMCAT6_USER` および `TOMCAT6_GROUP` は、いずれも `tomcat6` に設定されます。

  ['tomcat']['base\$1version'] を `tomcat7` に設定する場合、変数名は `TOMCAT7_USER` および `TOMCAT7_GROUP` に解決され、いずれも `tomcat7` に設定されます。
+ `JAVA_OPTS` は、`-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC` に設定されます。
  + `-Djava.awt.headless` を `true` に設定すると、インスタンスがヘッドレスでコンソールがないことがグラフィック エンジンに通知されます。これにより、特定のグラフィカルアプリケーションの不良動作に対処します。
  + `-Xmx128m` により、JVM は適切なメモリリソース (この例では 128 MB) を確保します。
  + `-XX:+UseConcMarkSweepGC` は、コンカレントマークスイープガベージコレクションを指定します。これは、ガベージコレクションの一時停止を限定するのに役立ちます。

    詳細については、「[コンカレントマークスイープコレクタの拡張機能](http://docs.oracle.com/javase/6/docs/technotes/guides/vm/cms-6.html)」を参照してください。
+ Tomcat のバージョンが 7 より前の場合、このテンプレートは、Ubuntu のバグに対処する `LC_ALL` を取り消します。

**注記**  
デフォルトの属性を使用すると、これらの環境変数の一部が単にデフォルト値に設定されます。一方、属性に対して環境変数を明示的に設定することは、カスタム JSON 属性を定義し、デフォルトの属性を上書きしてカスタム値を指定することを意味します。属性の上書きの詳細については、「[属性の上書き](workingcookbook-attributes.md)」を参照してください。

完全なテンプレートファイルについては、[ソースコード](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat)を参照してください。

### Server.xml 設定ファイル
<a name="create-custom-setup-config-server"></a>

2 番目の `template` リソースは、 `server.xml.erb` を使用して [`system.xml` 設定ファイル](http://tomcat.apache.org/tomcat-7.0-doc/config/)を作成します。このファイルは、servlet/JSP コンテナを設定します。`server.xml.erb` は、オペレーティングシステム固有の設定を含まないため、`template` ディレクトリの `default` サブディレクトリに配置されています。

このテンプレートは、標準設定を使用しますが、Tomcat 6 または Tomcat 7 のいずれかに対して `system.xml` ファイルを作成できます。たとえば、このテンプレートのサーバーセクションの次のコードは、指定されたバージョンに合わせてリスナーを適切に設定します。

```
<% if node['tomcat']['base_version'].to_i > 6 -%>
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
<% end -%>
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<% if node['tomcat']['base_version'].to_i < 7 -%>
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<% end -%>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<% if node['tomcat']['base_version'].to_i > 6 -%>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<% end -%>
```

このテンプレートは、ハードコーディングされた設定の代わりに属性を使用しているため、カスタム JSON 属性を定義することで、設定を簡単に変更できます。例えば: 

```
<Connector port="<%= node['tomcat']['port'] %>" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="<%= node['tomcat']['uri_encoding'] %>"
           redirectPort="<%= node['tomcat']['secure_port'] %>" />
```

詳細については、[ソースコード](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat)を参照してください。

## tomcat::apache\$1tomcat\$1bind
<a name="create-custom-setup-bind"></a>

`tomcat::apache_tomcat_bind` レシピは、Apache サーバーが Tomcat のフロントエンドとして動作すること、つまり、受信するリクエストを受け取って Tomcat に転送し、応答をクライアントに返すことを可能にします。この例では、Apache のプロキシ/ゲートウェイとして [mod\$1proxy](https://httpd.apache.org/docs/2.2/mod/mod_proxy.html) を使用します。

```
execute 'enable mod_proxy for apache-tomcat binding' do
  command '/usr/sbin/a2enmod proxy'
  not_if do
    ::File.symlink?(::File.join(node['apache']['dir'], 'mods-enabled', 'proxy.load')) || node['tomcat']['apache_tomcat_bind_mod'] !~ /\Aproxy/
  end
end

execute 'enable module for apache-tomcat binding' do
  command "/usr/sbin/a2enmod #{node['tomcat']['apache_tomcat_bind_mod']}"
  not_if {::File.symlink?(::File.join(node['apache']['dir'], 'mods-enabled', "#{node['tomcat']['apache_tomcat_bind_mod']}.load"))}
end

include_recipe 'apache2::service'

template 'tomcat thru apache binding' do
  path ::File.join(node['apache']['dir'], 'conf.d', node['tomcat']['apache_tomcat_bind_config'])
  source 'apache_tomcat_bind.conf.erb'
  owner 'root'
  group 'root'
  mode 0644
  backup false
  notifies :restart, resources(:service => 'apache2')
end
```

`mod_proxy` を有効にするには、`proxy` モジュールとプロトコルベースのモジュールを有効にする必要があります。プロトコルモジュールには、次の 2 つのオプションがあります。
+ HTTP: `proxy_http`
+ [Apache JServ Protocol](http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html) (AJP) : `proxy_ajp`

  AJP は、内部の Tomcat プロトコルです。

このレシピの両方の [execute リソース](https://docs.chef.io/chef/resources.html#execute)が `a2enmod` コマンドを実行します。このコマンドは、必要なシンボリックリンクを作成することで、指定されたモジュールを有効にします。
+ 最初の `execute` リソースは、`proxy` モジュールを有効にします。
+ 2 番目の `execute` リソースは、デフォルトで `proxy_http` に設定されているプロトコルモジュールを有効にします。

  AJP の方を使用する場合は、カスタム JSON を定義し、`apache_tomcat_bind_mod` 属性を上書きして、`proxy_ajp` に設定できます。

`apache2::service` レシピは、Apache サービスを定義する OpsWorks スタック組み込みレシピです。詳細については、 スタック GitHub OpsWorks リポジトリの[レシピ](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.4/apache2/recipes/service.rb)を参照してください。

`template` リソースでは、`apache_tomcat_bind.conf.erb` を使用して、デフォルトで `tomcat_bind.conf` という名前のファイルを作成します。ファイルは、`['apache']['dir']/.conf.d` ディレクトリに配置されます。`['apache']['dir']` 属性は、組み込みの `apache2` 属性ファイルで定義され、デフォルトでは `/etc/httpd` (Amazon Linux の場合) または `/etc/apache2` (Ubuntu の場合) に設定されます。この `template` リソースが設定ファイルを作成または変更する場合は、`notifies` コマンドが Apache サービスの再起動をスケジュール設定します。

```
<% if node['tomcat']['apache_tomcat_bind_mod'] == 'proxy_ajp' -%>
ProxyPass <%= node['tomcat']['apache_tomcat_bind_path'] %> ajp://localhost:<%= node['tomcat']['ajp_port'] %>/
ProxyPassReverse <%= node['tomcat']['apache_tomcat_bind_path'] %> ajp://localhost:<%= node['tomcat']['ajp_port'] %>/
<% else %>
ProxyPass <%= node['tomcat']['apache_tomcat_bind_path'] %> http://localhost:<%= node['tomcat']['port'] %>/
ProxyPassReverse <%= node['tomcat']['apache_tomcat_bind_path'] %> http://localhost:<%= node['tomcat']['port'] %>/
<% end -%>
```

このテンプレートは、[ProxyPass](https://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypass) ディレクティブおよび [ProxyPassReverse](https://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypassreverse) ディレクティブを使用して、Apache と Tomcat の間でトラフィックを渡すために使用するポートを設定します。両方のサーバーが同じインスタンスにあるため、1 つの localhost URL を使用することができ、どちらもデフォルトで `http://localhost:8080` に設定されます。