

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

# Vagrant インスタンスでの SDK for Ruby を使用します
<a name="cookbooks-101-opsworks-s3-vagrant"></a>

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

このトピックでは、Vagrant インスタンスで実行されているレシピで [AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/) を使用して Amazon S3 からファイルをダウンロードする方法を説明します。開始する前に、レシピが Amazon S3 にアクセスできるようにするアクセスキーとシークレットアクセスキーの一連の AWS 認証情報が必要です。

**重要**  
この目的でルートアカウントの認証情報を使わないことを強くお勧めします。代わりに、適切なポリシーで ユーザーを作成し、レシピにこれらの認証情報を提供します。  
認証情報を含むファイルを GitHub や Bitbucket の公開リポジトリにアップロードするなど、認証情報 (IAM ユーザーの認証情報も含む)を一般にアクセス可能な場所に置かないように注意してください。ご自分の認証情報が公開され、アカウントのセキュリティが侵害される恐れがあります。  
 EC2Amazon EC2 インスタンスで実行されるレシピでは、「[スタック Linux インスタンスでの SDK for Ruby OpsWorks の使用](cookbooks-101-opsworks-s3-opsworks.md)」で説明しているように、より便利なアプローチとして IAM ロールを使用できます。  
Amazon S3 バケットに配信されるコンテンツには、カスタマーコンテンツが含まれている場合があります。機密データの削除の詳細については、[「S3 バケットを空にする方法」](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)または[「S3 バケットを削除する方法」](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)を参照してください。

まだ適切な ユーザーが存在しない場合は、次のようにして作成できます。詳細については、[[IAM とは]](https://docs.aws.amazon.com/IAM/latest/UserGuide/Introduction.html)を参照してください。

**警告**  
IAM ユーザーは長期認証情報を保有するため、セキュリティ上のリスクが生じます。このリスクを軽減するために、これらのユーザーにはタスクの実行に必要な権限のみを付与し、不要になったユーザーは削除することをお勧めします。

**IAM ユーザーを作成するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. ナビゲーションペインで **ユーザー** を選択し、必要に応じて **ユーザーの追加** を選択して、新しい管理ユーザーを作成します。

1. **許可を設定** ページで、**ポリシーを直接アタッチする** を選択します。

1. **許可ポリシー** の検索ボックスに **S3** と入力すると、Amazon S3 のポリシーが表示されます。

   **AmazonS3ReadOnlyAccess** 必要であれば、[**AmazonS3FullAccess**] などのより広範なアクセス権限を付与することもできますが、標準的な手法では必要なアクセス権限だけを付与します。この場合、レシピはファイルをダウンロードするだけなので、読み取り専用アクセスで十分です。

1. [**次へ**] を選択します。

1. **ユーザーの作成** を選択します。

1. 次に、ユーザーのアクセスキーを作成します。IAM アクセスキーの詳細については、*「IAM ユーザーガイド」*の[「Managing access keys for IAM users」](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)(IAM ユーザーのアクセスキーの管理) を参照してください。

次に、ダウンロードされるファイルを用意する必要があります。この例では、新たに作成した `myfile.txt` という名前の S3 バケットに `cookbook_bucket` という名前のファイルが保存してあることを前提としています。

**ダウンロード用ファイルを提供するには**

1. 以下のテキストを持つ `myfile.txt` という名前のファイルを作成し、ワークステーションの便利な場所に保存します。

   ```
   This is the file that you just downloaded from Amazon S3.
   ```

1. [Amazon S3 console](https://console.aws.amazon.com/s3/) (Amazon S3 コンソール) で、**[Standard]** (標準) リージョンに `cookbook_bucket` という名前のバケットを作成し、バケットに `myfile.txt` をアップロードします。

クックブックを以下のようにセットアップします。

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

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

1. 「[例 1: パッケージのインストール](cookbooks-101-basics-packages.md)」で説明されているとおりに Test Kitchen を初期化および設定します。

1. `.kitchen.yml` のテキストを以下に置き換えます。

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
     environments_path: ./environments
   
   platforms:
     - name: ubuntu-14.04
   
   suites:
     - name: s3bucket
       provisioner:
         solo_rb:
           environment: test
       run_list:
         - recipe[s3bucket::default]
       attributes:
   ```

1. `s3bucket`: `recipes` と `environments` にディレクトリを 2 つ追加します。

1. 以下の `default_attributes` セクションを持つ `test.json` という名前の環境ファイルを作成し、`access_key` および `secret_key`の値をユーザーの対応するキーに置き換えます。クックブックの `environments` フォルダにファイルを保存します。

   ```
   {
     "default_attributes" : {
       "cookbooks_101" : {
         "access_key": "AKIAIOSFODNN7EXAMPLE",
         "secret_key" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
       }
     },
     "chef_type" : "environment",
     "json_class" : "Chef::Environment"
   }
   ```

インスタンスで実行されているレシピに認証情報を提供するには、さまざまな方法があります。重要な注意点は、誤ってキーを公開し、アカウントのセキュリティが侵害される可能性を減らす必要があることです。そのため、コードで明示的なキー値を使用することはお勧めできません。例では、代わりにキー値をノードオブジェクトに保存します。その場合、レシピはリテラル値を公開せずに、ノード構文を使用してキー値を参照できます。ノードオブジェクトにアクセスするには、ルート権限が必要です。そのため、キーが公開される可能性を制限できます。詳細については、「[AWS アクセスキーを管理するためのベストプラクティス](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html)」を参照してください。

**注記**  
例では入れ子になった属性 (最初の要素は `cookbooks_101`) が使用されていることに注意してください。これにより、ノードオブジェクト内に他の `access_key` または `secret_key` 属性がある場合に、名前の競合の可能性が制限されます。

次のレシピは、`myfile.text` バケットから `cookbook_bucket` をダウンロードします。

```
gem_package "aws-sdk ~> 3" do
  action :install
end

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

    s3 = Aws::S3::Client.new(
          :access_key_id => "#{node['cookbooks_101']['access_key']}",
          :secret_access_key => "#{node['cookbooks_101']['secret_key']}")

    myfile = s3.bucket['cookbook_bucket'].objects['myfile.txt']
    Dir.chdir("/tmp")
    File.open("myfile.txt", "w") do |f|
      f.write(myfile.read)
      f.close
    end
  end
  action :run
end
```

レシピの最初の部分では、gem パッケージである SDK for Ruby をインストールします。[gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) リソースは、レシピや他のアプリケーションによって使用される gem をインストールします。

**注記**  
インスタンスには 2 つの Ruby インスタンスがあり、このインスタンスは通常バージョンが異なります。1 つは Chef Client によって使用される専用インスタンスです。もう 1 つは、インスタンスで実行されているアプリケーションとレシピによって使用されます。gem パッケージをインストールする際に、この相違点を理解しておくことが重要です。gem をインストールするリソースには、[gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) と [chef\$1gem](https://docs.chef.io/chef/resources.html#chef-gem) という 2 つの種類があるためです。アプリケーションまたはレシピが gem パッケージを使用する場合には、`gem_package` でインストールします。`chef_gem` は、Chef クライアントが使用する gem パッケージに限り使用します。

レシピの残りの部分は、[ruby\$1block](https://docs.chef.io/chef/resources.html#ruby-block) リソースです。これには、ファイルをダウンロードする Ruby コードが含まれています。レシピは Ruby アプリケーションであるため、コードをレシピに直接記述できると考えられがちです。しかし、Chef 実行はリソースを実行する前にすべてのコードをコンパイルします。例のコードをレシピに直接記述すると、Ruby は `require 'aws-sdk'` リソースを実行する前に `gem_package` ステートメントを解決しようとします。SDK for Ruby はまだインストールされていないため、コンパイルは失敗します。

`ruby_block` リソースのコードは、そのリソースが実行されるまでコンパイルされません。この例では、`ruby_block` リソースが SDK for Ruby のインストールを終了した後で、`gem_package` リソースが実行されます。そのため、コードが正常に実行されます。

`ruby_block` 内のコードは、次のように動作します。

1. サービスインターフェイスを提供する、新しい [https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3.html) オブジェクトを作成します。

   アクセスキーとシークレットキーは、ノードオブジェクトに保存されている値を参照することによって指定されます。

1. `S3` オブジェクトの `bucket.objects` アソシエーションを呼び出します。このアソシエーションは、`myfile.txt` を表す `myfile` という名前の[https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html) オブジェクトを返します。

1. `Dir.chdir` を使用して、`/tmp` に作業ディレクトリを設定します。

1. `myfile.txt` という名前のファイルを開き、`myfile` の内容を書き込んで、ファイルを閉じます。

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

1. 例のレシピで `default.rb` という名前のファイルを作成し、`recipes` ディレクトリに保存します。

1. `kitchen converge` を実行します。

1. `kitchen login` を実行してインスタンスにログインし、`ls /tmp` を実行します。いくつかの Test Kitchen ファイルおよびディレクトリと共に、`myfile.txt` が表示されるはずです。

   ```
   vagrant@s3bucket-ubuntu-1204:~$ ls /tmp
   install.sh  kitchen  myfile.txt  stderr
   ```

   ファイルの内容が正しいことを検証するために、`cat /tmp/myfile.txt` を実行することもできます。

完了したら、`kitchen destroy` を実行してインスタンスを終了します。