翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Vagrant インスタンスでの SDK for Ruby を使用します
重要
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、 AWS re:Post
このトピックでは、Vagrant インスタンスで実行されているレシピで AWS SDK for Ruby を使用して Amazon S3 からファイルをダウンロードする方法を説明します。開始する前に、レシピが Amazon S3 にアクセスできるようにするアクセスキーとシークレットアクセスキーという AWS 認証情報のセットが必要です。
重要
この目的でルートアカウントの認証情報を使わないことを強くお勧めします。代わりに、適切なポリシーで ユーザーを作成し、レシピにこれらの認証情報を提供します。
認証情報を含むファイルを GitHub や Bitbucket の公開リポジトリにアップロードするなど、認証情報 (IAM ユーザーの認証情報も含む)を一般にアクセス可能な場所に置かないように注意してください。ご自分の認証情報が公開され、アカウントのセキュリティが侵害される恐れがあります。
EC2Amazon EC2 インスタンスで実行されるレシピでは、「スタック Linux インスタンスでの SDK for Ruby AWS OpsWorks の使用」で説明しているように、より便利なアプローチとして IAM ロールを使用できます。
Amazon S3 バケットに配信されるコンテンツには、カスタマーコンテンツが含まれている場合があります。機密データの削除の詳細については、「S3 バケットを空にする方法」または「S3 バケットを削除する方法」を参照してください。
まだ適切な ユーザーが存在しない場合は、次のようにして作成できます。詳細については、[IAM とは]を参照してください。
警告
IAM ユーザーは長期認証情報を保有するため、セキュリティ上のリスクが生じます。このリスクを軽減するために、これらのユーザーにはタスクの実行に必要な権限のみを付与し、不要になったユーザーを削除することをお勧めします。
IAM ユーザーを作成するには
にサインイン AWS Management Console し、https://console.aws.amazon.com/iam/
で IAM コンソールを開きます。 -
ナビゲーションペインで ユーザー を選択し、必要に応じて ユーザーの追加 を選択して、新しい管理ユーザーを作成します。
-
許可を設定 ページで、ポリシーを直接アタッチする を選択します。
-
許可ポリシー の検索ボックスに
S3
と入力すると、Amazon S3 のポリシーが表示されます。AmazonS3ReadOnlyAccess 必要であれば、[AmazonS3FullAccess] などのより広範なアクセス権限を付与することもできますが、標準的な手法では必要なアクセス権限だけを付与します。この場合、レシピはファイルをダウンロードするだけなので、読み取り専用アクセスで十分です。
-
[Next (次へ)] を選択します。
-
ユーザーの作成 を選択します。
-
次に、ユーザーのアクセスキーを作成します。IAM アクセスキーの詳細については、「IAM ユーザーガイド」の「Managing access keys for IAM users」(IAM ユーザーのアクセスキーの管理) を参照してください。
次に、ダウンロードされるファイルを用意する必要があります。この例では、新たに作成した myfile.txt
という名前の S3 バケットに cookbook_bucket
という名前のファイルが保存してあることを前提としています。
ダウンロード用ファイルを提供するには
-
以下のテキストを持つ
myfile.txt
という名前のファイルを作成し、ワークステーションの便利な場所に保存します。This is the file that you just downloaded from Amazon S3.
-
Amazon S3 console
(Amazon S3 コンソール) で、[Standard] (標準) リージョンに cookbook_bucket
という名前のバケットを作成し、バケットにmyfile.txt
をアップロードします。
クックブックを以下のようにセットアップします。
クックブックをセットアップするには
-
opsworks_cookbooks
内にs3bucket
という名前のディレクトリを作成し、そこに移動します。 -
「例 1: パッケージのインストール」で説明されているとおりに Test Kitchen を初期化および設定します。
-
.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:
-
s3bucket
:recipes
とenvironments
にディレクトリを 2 つ追加します。 -
以下の
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 アクセスキーを管理するためのベストプラクティス」を参照してください。
注記
例では入れ子になった属性 (最初の要素は 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_package
注記
インスタンスには 2 つの Ruby インスタンスがあり、このインスタンスは通常バージョンが異なります。1 つは Chef Client によって使用される専用インスタンスです。もう 1 つは、インスタンスで実行されているアプリケーションとレシピによって使用されます。gem パッケージをインストールする際に、この相違点を理解しておくことが重要です。gem をインストールするリソースには、gem_packagegem_package
でインストールします。chef_gem
は、Chef クライアントが使用する gem パッケージに限り使用します。
レシピの残りの部分は、ruby_blockrequire 'aws-sdk'
リソースを実行する前に gem_package
ステートメントを解決しようとします。SDK for Ruby はまだインストールされていないため、コンパイルは失敗します。
ruby_block
リソースのコードは、そのリソースが実行されるまでコンパイルされません。この例では、ruby_block
リソースが SDK for Ruby のインストールを終了した後で、gem_package
リソースが実行されます。そのため、コードが正常に実行されます。
ruby_block
内のコードは、次のように動作します。
-
サービスインターフェイスを提供する、新しい
Aws::S3
オブジェクトを作成します。アクセスキーとシークレットキーは、ノードオブジェクトに保存されている値を参照することによって指定されます。
-
S3
オブジェクトのbucket.objects
アソシエーションを呼び出します。このアソシエーションは、myfile.txt
を表すmyfile
という名前のAws::S3::Object
オブジェクトを返します。 -
Dir.chdir
を使用して、/tmp
に作業ディレクトリを設定します。 -
myfile.txt
という名前のファイルを開き、myfile
の内容を書き込んで、ファイルを閉じます。
レシピを実行するには
-
例のレシピで
default.rb
という名前のファイルを作成し、recipes
ディレクトリに保存します。 -
kitchen converge
を実行します。 -
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
を実行してインスタンスを終了します。