

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

# ステップ 2.5: アプリケーションをデプロイする
<a name="gettingstarted-windows-deploy"></a>

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

IIS のインストールにより、アプリケーションのコードと関連ファイルに使用される `C:\inetpub\wwwroot` ディレクトリが作成されます。次のステップとして、そのディレクトリにアプリケーションをインストールします。この例では、静的 HTML ホーム ページ `default.html` を `C:\inetpub\wwwroot` にインストールします。一般的なアプローチを簡単に拡張して、ASP.NET アプリケーションなど、より複雑なシナリオを扱うことができます。

アプリケーションのファイルをクックブックに含めて、`install.rb` がそれらのファイルを `C:\inetpub\wwwroot` にコピーするようにすることができます。これを行う方法の例については、「[例 6: ファイルの作成](cookbooks-101-basics-files.md)」を参照してください。ただし、このアプローチは柔軟性や効率性があまり高くないため、通常はクックブック開発をアプリケーション開発と分割することをお勧めします。

推奨される解決策は、リポジトリ (クックブックのリポジトリだけでなく、任意のリポジトリ) からアプリケーションのコードと関連ファイルを取得し、各 IIS サーバーインスタンスにインストールする個別のデプロイレシピを実装することです。このアプローチにより、アプリケーション開発からクックブック開発が分割されるため、アプリケーションを更新する必要があるときは、クックブックを更新しなくてもデプロイレシピだけを再度実行することができます。

このトピックでは、IIS Server に `default.htm` をデプロイするシンプルなデプロイレシピを実装する方法を説明します。この例は、より複雑なアプリケーションに簡単に拡張できます。

**Topics**
+ [アプリケーションの作成とリポジトリへの保存](#w2ab1c14c47c17c23c25c15)
+ [レシピの実装によるアプリケーションのデプロイ](#w2ab1c14c47c17c23c25c17)
+ [インスタンスのクックブックの更新](#w2ab1c14c47c17c23c25c19)
+ [カスタム IISレイヤーへのレシピの追加](#w2ab1c14c47c17c23c25c21)
+ [アプリケーションの追加](#w2ab1c14c47c17c23c25c23)
+ [アプリケーションのデプロイとアプリケーションの実行](#w2ab1c14c47c17c23c25c25)

## アプリケーションの作成とリポジトリへの保存
<a name="w2ab1c14c47c17c23c25c15"></a>

アプリケーションにはどのリポジトリでも使用できます。わかりやすいように、この例では `default.htm` をパブリック S3 バケットに保存します。

**アプリケーションを作成するには**

1. ワークステーション上の適切な場所に、`iis-application` というディレクトリを作成します。

1. `iis-application` に、次のコンテンツを含む `default.htm` ファイルを追加します。

   ```
   <!DOCTYPE html>
   <html>
     <head>
       <title>IIS Example</title>
     </head>
     <body>
       <h1>Hello World!</h1>
     </body>
   </html>
   ```

1. [S3 バケットを作成](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)し、[`default.htm`をバケットにアップロード](https://docs.aws.amazon.com/AmazonS3/latest/gsg/PuttingAnObjectInABucket.html)して、後で使用できるよう URL を記録しておきます。わかりやすいよう、[ファイルを公開](https://docs.aws.amazon.com/AmazonS3/latest/gsg/OpeningAnObject.html)します。
**注記**  
これは、とてもシンプルなアプリケーションですが、基本的な原則を拡張して本稼働レベルのアプリケーションを扱うことができます。  
複数のファイルを含むより複雑なアプリケーションの場合、通常は `iis-application` の .zip アーカイブを作成し、S3 バケットにアップロードした方がシンプルです。  
アップロード後には .zip ファイルをダウンロードし、内容を適切なディレクトリに展開できます。複数のファイルをダウンロードしたり、ディレクトリ構造を作成したりする必要はありません。
本稼働アプリケーションの場合、ファイルを秘密にすることができます。レシピがプライベート S3 バケットからファイルをダウンロードできるようにする方法の例は、「[スタック Windows インスタンスでの SDK for Ruby OpsWorks の使用](cookbooks-101-opsworks-s3-windows.md)」を参照してください。
アプリケーションは、任意の適切なリポジトリに保存できます。  
通常は、リポジトリのパブリック API を使用してアプリケーションをダウンロードします。この例では、Amazon S3 API を使用します。たとえば、アプリケーションを GitHub に保存した場合、[GitHub API](https://developer.github.com/guides/getting-started/) を使用できます。

## レシピの実装によるアプリケーションのデプロイ
<a name="w2ab1c14c47c17c23c25c17"></a>

以下のコンテンツを含む `deploy.rb` という名前のレシピを `iis-cookbook` `recipes` ディレクトリに追加します。

```
chef_gem "aws-sdk-s3" do
  compile_time false
  action :install
end

ruby_block "download-object" do
  block do
    require 'aws-sdk-s3'

    #1  
    # Aws.config[:ssl_ca_bundle] = 'C:\ProgramData\Git\bin\curl-ca-bundle.crt'
    Aws.use_bundled_cert!

    #2  
    query = Chef::Search::Query.new
    app = query.search(:aws_opsworks_app, "type:other").first
    s3region = app[0][:environment][:S3REGION]
    s3bucket = app[0][:environment][:BUCKET]
    s3filename = app[0][:environment][:FILENAME]

    #3  
    s3_client = Aws::S3::Client.new(region: s3region)
    s3_client.get_object(bucket: s3bucket,
                         key: s3filename,
                         response_target: 'C:\inetpub\wwwroot\default.htm')
  end 
  action :run
end
```

この例では [[SDK for Ruby v2]](https://docs.aws.amazon.com/sdkforruby/api/index.html) を使用してファイルをダウンロードします。ただし、 OpsWorks スタックはこの SDK を Windows インスタンスにインストールしないため、レシピはそのタスクを処理する [https://docs.chef.io/chef/resources.html#chef-gem](https://docs.chef.io/chef/resources.html#chef-gem)リソースで始まります。

**注記**  
`chef_gem` リソースは、gem を Chef の専用 Ruby バージョン (そのレシピが使用するバージョン) にインストールします。システム全体の Ruby バージョンに gem をインストールする場合、[gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) リソースを使用します。

レシピの大部分は [https://docs.chef.io/chef/resources.html#ruby-block](https://docs.chef.io/chef/resources.html#ruby-block) リソースで、SDK for Ruby を使用して `default.htm` をダウンロードする Ruby コードのブロックを実行します。`ruby_block` 内のコードは以下のセクションに分割できます。それぞれ、コード例の番号付きコメントに対応します。

**1: 証明書バンドルの指定**  
Amazon S3 は SSL を使用するため、S3 バケットからオブジェクトをダウンロードするために適切な証明書が必要です。SDK for Ruby v2 には証明書バンドルが含まれていないため、証明書バンドルを指定して SDK for Ruby で使用するように設定する必要があります。 OpsWorks スタックは証明書バンドルを直接インストールしませんが、証明書バンドル () を含む Git をインストールします`curl-ca-bundle.crt`。便宜上、この例では Git の証明書バンドルを SSL に使用するように SDK for Ruby を設定します。独自のバンドルをインストールして、それに応じて SDK を設定することもできます。

**2: リポジトリデータの取得**  
Amazon S3 からオブジェクトをダウンロードするには、AWS のリージョン、バケット名、キー名が必要です。後で説明するように、この例では、一連の環境変数をアプリと関連付けることでこの情報を提供します。アプリケーションをデプロイすると、 OpsWorks スタックはインスタンスのノードオブジェクトに一連の属性を追加します。これらの属性は本質的に、アプリケーションの設定 (環境変数など) を含むハッシュテーブルです。このアプリケーションのアプリケーション属性は、次のようになります (JSON 形式)。  

```
{
  "app_id": "8f71a9b5-de7f-451c-8505-3f35086e5bb3",
  "app_source": {
      "password": null,
      "revision": null,
      "ssh_key": null,
      "type": "other",
      "url": null,
      "user": null
  },
  "attributes": {
      "auto_bundle_on_deploy": true,
      "aws_flow_ruby_settings": {},
      "document_root": null,
      "rails_env": null
  },
  "data_sources": [{"type": "None"}],
  "domains": ["iis_example_app"],
  "enable_ssl": false,
  "environment": {
      "S3REGION": "us-west-2",
      "BUCKET": "windows-example-app",
      "FILENAME": "default.htm"
  },
  "name": "IIS-Example-App",
  "shortname": "iis_example_app",
  "ssl_configuration": {
      "certificate": null,
      "private_key": null,
      "chain": null
  },
  "type": "other",
  "deploy": true
}
```
アプリケーションの環境変数は、`[:environment]` 属性に保存されます。環境変数を取得するには、Chef 検索クエリを使用してアプリケーションのハッシュテーブルを取得します。このテーブルは、`aws_opsworks_app` ノード配下にあります。このアプリは、`other` タイプとして定義されるため、クエリはそのタイプのアプリケーションを検索します。レシピは、このインスタンスにはアプリケーションが 1 つしかないという事実を利用しているため、対象となるハッシュテーブルは `app[0]` だけです。便宜上の理由で、レシピはその後リージョン、バケット、ファイル名を変数に割り当てます。  
Chef 検索の使用方法の詳細については、「[Chef の検索での属性値の取得](cookbooks-101-opsworks-opsworks-stack-config-search.md)」を参照してください。

**3: ファイルのダウンロード**  
レシピの 3 番目の部分では、[S3 クライアントオブジェクト](https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html)が作成され、その `[get\$1object](https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#get_object-instance_method)` メソッドを使用して `default.htm` がインスタンスの `C:\inetpub\wwwroot` ディレクトリにダウンロードされます。

**注記**  
レシピは Ruby アプリケーションであるため、Ruby コードは必ずしも `ruby_block` に存在する必要はありません。ただし、レシピの本文のコードが最初に実行され、その後リソースが順番に実行されます。この例では、レシピ本文にダウンロードコードを配置しようとすると、`chef_gem` リソースによりまだ SDK for Ruby がインストールされていないため失敗します。`chef_gem` リソースが SDK for Ruby をインストールした後、そのリソースが実行される際に `ruby_block` リソース内のそのコードが実行されます。

## インスタンスのクックブックの更新
<a name="w2ab1c14c47c17c23c25c19"></a>

OpsWorks スタックは、新しいインスタンスにカスタムクックブックを自動的にインストールします。ただし、既存のインスタンスを使用しているため、クックブックを手動で更新する必要があります。

**インスタンスのクックブックを更新するには**

1. `iis-cookbook` の `.zip` アーカイブを作成し、S3 バケットにアップロードします。

   これにより既存のクックブックが上書きされますが、URL は変更されないため、スタック設定の更新は不要です。

1. インスタンスがオンラインでない場合は再起動してください。

1. インスタンスがオンラインになったら、ナビゲーションペインで **[Stack]** を選択し、**[Run Command]** を選択します。

1. **[Command]** で、[[Update Custom Cookbooks]](workingstacks-commands.md) を選択します。このコマンドを実行すると、更新されたクックブックがインスタンスにインストールされます。

1. [**Update Custom Cookbooks**] を選択します。コマンドの実行完了までには数分かかることがあります。

## カスタム IISレイヤーへのレシピの追加
<a name="w2ab1c14c47c17c23c25c21"></a>

`install.rb` と同様、デプロイを処理するには、`deploy.rb` を適切なライフサイクルイベントに割り当てることをお勧めします。通常は、Deploy イベントにデプロイレシピを割り当てます。それらは、まとめて Deploy レシピと呼ばれます。レシピを Deploy イベントに割り当ててもイベントはトリガーされません。代わりに、次のようになります。
+ 新しいインスタンスの場合、 OpsWorks スタックは Setup レシピの完了後に Deploy レシピを自動的に実行するため、新しいインスタンスは自動的に現在のアプリケーションバージョンになります。
+ オンラインインスタンスでは、[デプロイコマンド](workingapps-deploying.md)を使用して新しいアプリケーションまたは更新されたアプリケーションを手動でインストールします。

  このコマンドはスタックのインスタンスで Deploy イベントをトリガーし、これによって Deploy レシピが実行されます。

**レイヤーの Deploy イベントに deploy.rb を割り当てるには**

1. ナビゲーションペインで**［レイヤー］**を選択し、続いて**［レイヤーのIISExample］**の**［レシピ］**を選択します。

1. **[Custom Chef Recipes]** で、[ **iis-cookbook::deploy**] を **[デプロイ]** レシピボックスに追加し、[**\$1**] を選択してレシピをレイヤーに追加します。

1. [**Save**] を選択して新しい設定を保存します。カスタム Deploy レシピに `iis-cookbook::deploy` が含まれるようになります。

## アプリケーションの追加
<a name="w2ab1c14c47c17c23c25c23"></a>

最後のタスクでは、スタックにアプリケーションを追加して、 OpsWorks スタック環境でアプリケーションを表します。アプリケーションには、アプリケーションの表示名などのメタデータと、リポジトリからアプリケーションをダウンロードするのに必要なデータが含まれます。

**アプリケーションをスタックに追加するには**

1. ナビゲーションペインで **[Apps]** を選択し、**[Add an app]** を選択します。

1. 以下の設定を使用してアプリケーションを設定します。
   + **[Name]** (名前) - I **IIS-Example-App**
   + **[Repository Type]** (リポジトリタイプ) - **[Other]** (その他)
   + **[Environment Variables]** (環境変数) 以下の３つの環境変数を追加します。
     + **S3REGION** - バケットのリージョン (この場合は `us-west-1`)。
     + **BUCKET** - バケット名 (`windows-example-app` など)。
     + **FILENAME** - ファイル名 (**default.htm**)。

1. 残りの設定はデフォルト値をそのまま使い、[**Add App**] を選択してアプリケーションをスタックに追加します。

**注記**  
この例では、ダウンロードデータを提供するために環境変数を使用します。別の方法は、S3 Archive リポジトリタイプを使用してファイルの URL を提供することです。 OpsWorks スタックは、AWS 認証情報などのオプションデータとともに情報をアプリケーションの `app_source` 属性に追加します。デプロイしたレシピは、URL をアプリケーション属性から取得して解析し、リージョン、バケット名およびファイル名を抽出できなければなりません。

## アプリケーションのデプロイとアプリケーションの実行
<a name="w2ab1c14c47c17c23c25c25"></a>

OpsWorks スタックは、アプリケーションを自動的に新しいインスタンスにデプロイしますが、オンラインインスタンスにはデプロイしません。インスタンスは既に実行されているため、アプリケーションを手動でデプロイする必要があります。

**アプリケーションをデプロイするには**

1. ナビゲーションペインで**「アプリケーション」**を選択し、続いてアプリの**「アクション」**列で**「デプロイ」**を選択します。

1. **[Command]** は **[Deploy]** に設されていなければなりません。**[Deploy App]** (デプロイアプリケーション) ページの右下で **[Deploy]** (デプロイ) を選択します。コマンドの実行完了までには数分かかることがあります。

   デプロイメントが完了したら、[**Apps**] ページに戻ります。[**Status**] インジケータには緑で [**successful**] と表示され、アプリケーション名の横には、デプロイメントの正常終了を示す緑のチェックマークが表示されます。

**注記**  
Windows アプリケーションは常に [**Other**] アプリケーションタイプのため、アプリケーションをデプロイすると次の処理が実行されます。  
前述のとおり、アプリケーションのデータが、[スタック設定とデプロイ属性](workingcookbook-json.md)に追加されます。
カスタム Deploy レシピを実行する Deploy イベントがスタックのインスタンスでトリガーされます。

**注記**  
失敗したデプロイまたはアプリケーションをトラブルシューティングする方法についての詳細は、[レシピのデバッグ](troubleshoot-debug.md) を参照してください。

アプリケーションがインストールされます。**[Navigation]** (ナビゲーション) ペインで **[Instances]** (インスタンス) を選択し、続いてインスタンスのパブリック IP アドレスを選択することで開くことができます。これにより、HTTP リクエストがインスタンスに送信され、ブラウザに次のように表示されます。

![\[Text displaying "Hello World!" in large, bold font against a white background.\]](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/images/windows-iis-app.png)
