Deploy レシピ - AWS OpsWorks

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

Deploy レシピ

重要

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

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

AWS OpsWorks スタックは、標準的なアプリケーションタイプのアプリケーションを、対応する組み込みのアプリケーションサーバーレイヤーに自動的にデプロイします。アプリケーションをカスタムレイヤーにデプロイするには、アプリケーションのファイルをリポジトリからインスタンスの適切な場所にダウンロードするカスタム 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_diropworks_deploy を使用して、アプリケーションをインストールします。

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

注記

[:opsworks][:deploy_user][:user] 属性と [:opsworks][:deploy_user][:group] 属性により、デプロイされているアプリケーションのユーザーとグループが定義されます。これらの属性は、組み込みのデプロイクックブックの deploy.rb 属性ファイルで定義されています。[:opsworks][:deploy_user][:user] の初期値は deploy です。[:opsworks][:deploy_user][:group] のデフォルト値は、インスタンスのオペレーティングシステムによって異なります。

  • Ubuntu インスタンスでは、デフォルトのグループは www-data です。

  • Nginx と Unicorn を使用する Rails アプリケーションアプリケーションサーバーレイヤーのメンバーである Amazon Linux インスタンスの場合、デフォルトのグループは nginx です。

  • その他のすべての Amazon Linux インスタンスの場合、デフォルトのグループは apache です。

カスタム JSON またはカスタム属性ファイルを使用して適切な属性を上書きすることにより、設定を変更できます。詳細については、「属性の上書き」を参照してください。

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

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

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

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

  3. 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_dirwebapp_dir を作成して、current ディレクトリと webapp ディレクトリをそれぞれ表します。次に、link リソースを使用して、webapp_dircurrent_dir にリンクします。AWS OpsWorks スタックの 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 リソースを使用して、再起動するようにサービスに通知しますが、それは ['tomcat']['auto_deploy']'true' に設定されている場合のみです。その他の場合、Tomcat は webapps ディレクトリ内の変更をリッスンします。これにより、明示的な Tomcat サービスの再起動が不必要になります。

注記

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

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