

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

# Deploy レシピ
<a name="create-custom-deploy"></a>

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

Deploy レシピは、レイヤーの Deploy [ライフサイクル](workingcookbook-events.md)イベントに割り当てられます。これは通常、アプリケーションをデプロイするたびにスタックのすべてのインスタンスで発生しますが、オプションでイベントを指定されたインスタンスのみに制限できます。 OpsWorks スタックは、Setup レシピの完了後に、新しいインスタンスで Deploy レシピも実行します。Deploy レシピの主な目的は、コードと関連ファイルをリポジトリからアプリケーションサーバーレイヤーのインスタンスにデプロイすることです。ただし、多くの場合、その他のレイヤーでも Deploy レシピを実行します。これにより、これらのレイヤーのインスタンスで、たとえば、新しくデプロイされたアプリケーションに応じて設定を更新できるようになります。Deploy レシピを実装するときは、Deploy イベントが必ずしもアプリケーションがインスタンスにデプロイされることを意味するわけではないことに注意してください。アプリケーションがスタック内の別のインスタンスにデプロイされていることを単に通知することで、そのインスタンスで必要な更新ができるようにしているだけの場合もあります。このレシピは、適切に応答できる必要があります。それは、何も処理を実行しない場合があることを意味します。

OpsWorks スタックは、標準アプリケーションタイプのアプリケーションを対応する組み込みアプリケーションサーバーレイヤーに自動的にデプロイします。アプリケーションをカスタムレイヤーにデプロイするには、アプリケーションのファイルをリポジトリからインスタンスの適切な場所にダウンロードするカスタム Deploy レシピを実装する必要があります。ただし、多くの場合、組み込みの[デプロイクックブック](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.4/deploy)を使用してデプロイの一部の側面を処理することで、記述する必要のあるコードの量を制限することができます。たとえば、サポートされているリポジトリの 1 つにファイルを保存する場合、リポジトリからレイヤーのインスタンスへのファイルダウンロードの詳細を組み込みのクックブックで処理できます。

`tomcat::deploy` レシピは、Deploy ライフサイクルイベントに割り当てられます。

```
include_recipe 'deploy'

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

  opsworks_deploy do
    deploy_data deploy
    app application
  end
...
```

`tomcat::deploy` レシピは、アプリケーション固有ではないデプロイの側面に組み込みのデプロイクックブックを使用します。`deploy` レシピ (組み込み `deploy::default` レシピの省略表現) は、`deploy` 属性のデータに基づいてユーザー、グループなどのセットアップの詳細を処理する組み込みレシピです。

このレシピは、2 つの組み込みの Chef 定義 `opsworks_deploy_dir` と `opworks_deploy` を使用して、アプリケーションをインストールします。

`opsworks_deploy_dir` 定義は、アプリケーションのデプロイメント JSON のデータに基づいて、ディレクトリ構造をセットアップします。定義は、基本的にはリソース定義をパッケージするための便利な方法であり、クックブックの `definitions` ディレクトリに配置されています。レシピでは、リソースと同様に定義を使用できますが、この定義自体には、定義に含まれた単なるリソースである関連付けられたプロバイダーはありません。基盤となるリソース定義に渡されるレシピ内の変数は定義できます。`tomcat::deploy` レシピは、デプロイメント JSON のデータに基づいて、`user`、`group`、および `path` の各変数を設定します。これらの変数は、定義の [directory リソース](https://docs.chef.io/chef/resources.html#directory)に渡されます。このリソースはディレクトリを管理します。

**注記**  
`[:opsworks][:deploy_user][:user]` 属性と `[:opsworks][:deploy_user][:group]` 属性により、デプロイされているアプリケーションのユーザーとグループが定義されます。これらの属性は、[組み込みのデプロイクックブックの `deploy.rb` 属性ファイル](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.4/deploy/attributes/deploy.rb)で定義されています。`[:opsworks][:deploy_user][:user]` の初期値は `deploy` です。`[:opsworks][:deploy_user][:group]` のデフォルト値は、インスタンスのオペレーティングシステムによって異なります。  
Ubuntu インスタンスでは、デフォルトのグループは `www-data` です。
Nginx と Unicorn を使用する Rails アプリケーションアプリケーションサーバーレイヤーのメンバーである Amazon Linux インスタンスの場合、デフォルトのグループは `nginx` です。
その他のすべての Amazon Linux インスタンスの場合、デフォルトのグループは `apache` です。
カスタム JSON またはカスタム属性ファイルを使用して適切な属性を上書きすることにより、設定を変更できます。詳細については、「[属性の上書き](workingcookbook-attributes.md)」を参照してください。

その他の定義 `opsworks_deploy` は、アプリケーションのコードとリポジトリの関連ファイルの確認、およびそれらのインスタンスへのデプロイの詳細を、`deploy` 属性のデータに基づいて処理します。任意のアプリケーションタイプに対してこの定義を使用できます。ディレクトリ名などのデプロイの詳細はコンソールまたは API で指定して、`deploy` 属性に含まれています。ただし、`opsworks_deploy` は、Git、Subversion、S3、および HTTP という 4 つの[サポートされているリポジトリのタイプ](workingcookbook-installingcustom-repo.md)に対してのみ機能します。異なるリポジトリのタイプを使用する場合は、このコードを自分で実装する必要があります。

アプリケーションのファイルを、Tomcat の `webapps` ディレクトリにインストールします。一般的な方法は、ファイルを `webapps` に直接コピーすることです。ただし、 OpsWorks スタックのデプロイは、インスタンス上に最大 5 つのバージョンのアプリケーションを保持するように設計されているため、必要に応じて以前のバージョンにロールバックできます。したがって、 OpsWorks スタックは以下を実行します。

1. `/srv/www/my_1st_jsp/releases/20130731141527` など、名前にタイムスタンプが含まれた明確に区別できるディレクトリにアプリケーションをデプロイします。

1. この一意のディレクトリに、`current` という名前が付いた `/srv/www/my_1st_jsp/current` などのシンボリックリンクを作成します。

1. `webapps` ディレクトリからステップ 2 で作成した `current` へのシンボリックリンクがまだない場合は、これを作成します。

以前のバージョンにロールバックする必要がある場合は、該当するタイムスタンプが含まれた明確に区別できるディレクトリをポイントするように `current` シンボリックリンクを変更します。例えば、`/srv/www/my_1st_jsp/current` のリンクターゲットを変更します。

`tomcat::deploy` の中間のセクションは、シンボリックリンクをセットアップします。

```
  ...
  current_dir = ::File.join(deploy[:deploy_to], 'current')
  webapp_dir = ::File.join(node['tomcat']['webapps_base_dir'], deploy[:document_root].blank? ? application : deploy[:document_root])

  # opsworks_deploy creates some stub dirs, which are not needed for typical webapps
  ruby_block "remove unnecessary directory entries in #{current_dir}" do
    block do
      node['tomcat']['webapps_dir_entries_to_delete'].each do |dir_entry|
        ::FileUtils.rm_rf(::File.join(current_dir, dir_entry), :secure => true)
      end
    end
  end

  link webapp_dir do
    to current_dir
    action :create
  end
  ...
```

このレシピは、まず 2 つの変数 `current_dir` と `webapp_dir` を作成して、`current` ディレクトリと `webapp` ディレクトリをそれぞれ表します。次に、`link` リソースを使用して、`webapp_dir` を `current_dir` にリンクします。 OpsWorks Stacks `deploy::default`レシピは、この例に必要ではないスタブディレクトリを作成するため、抜粋の中央部分で削除します。

`tomcat::deploy` の最後の部分は、必要に応じて Tomcat サービスを再起動します。

```
  ...
  include_recipe 'tomcat::service'

  execute 'trigger tomcat service restart' do
    command '/bin/true'
    not_if { node['tomcat']['auto_deploy'].to_s == 'true' }
    notifies :restart, resources(:service => 'tomcat')
  end
end

include_recipe 'tomcat::context'
```

このレシピは、最初に `tomcat::service` を実行して、この Chef 実行に対してサービスが定義されるようにします。次に、[execute リソース](https://docs.chef.io/chef/resources.html#execute)を使用して、再起動するようにサービスに通知しますが、それは `['tomcat']['auto_deploy']` が `'true'` に設定されている場合のみです。その他の場合、Tomcat は `webapps` ディレクトリ内の変更をリッスンします。これにより、明示的な Tomcat サービスの再起動が不必要になります。

**注記**  
`execute` リソースは実際には実質的なことを何も実行せず、`/bin/true` は単に成功コードを返すダミーのシェルスクリプトです。単に再起動通知を生成するための便利な方法として使用されています。前に説明したように、通知を使用することで、サービスが必要以上に頻繁に再起動されなくなります。

最後に、`tomcat::deploy` は `tomcat::context` を実行し、バックエンドデータベースが変更されている場合は、ウェブアプリケーションのコンテキスト設定ファイルを更新します。