Vagrant インスタンスでの SDK for Ruby を使用します - AWS OpsWorks

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

Vagrant インスタンスでの SDK for Ruby を使用します

重要

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

このトピックでは、Vagrant インスタンスで実行されているレシピで AWS SDK for Ruby を使用して Amazon S3 からファイルをダウンロードする方法を説明します。開始する前に、まずレシピが Amazon S3 にアクセスできるようにする一連のAWS 認証情報 (アクセスキーとシークレットアクセスキー)を用意する必要があります。

重要

この目的でルートアカウントの認証情報を使わないことを強くお勧めします。代わりに、適切なポリシーで ユーザーを作成し、レシピにこれらの認証情報を提供します。

認証情報を含むファイルをパブリック GitHub リポジトリまたは Bitbucket リポジトリにアップロードするなど、IAM ユーザー認証情報を含め、パブリックにアクセス可能な場所に認証情報を配置しないように注意してください。ご自分の認証情報が公開され、アカウントのセキュリティが侵害される恐れがあります。

EC2Amazon EC2 インスタンスで実行されるレシピでは、「AWS OpsWorks スタックの Linux インスタンスでの SDK for Ruby の使用」で説明しているように、より便利なアプローチとして IAM ロールを使用できます。

Amazon S3 バケットに配信されるコンテンツには、カスタマーコンテンツが含まれている場合があります。機密データの削除の詳細については、「S3 バケットを空にする方法」または「S3 バケットを削除する方法」を参照してください。

まだ適切な ユーザーが存在しない場合は、次のようにして作成できます。詳細については、[IAM とは]を参照してください。

警告

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

IAM ユーザーを作成するには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

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

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

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

    AmazonS3ReadOnlyAccess を選択します。必要に応じて、AmazonS3FullAccess などのより広範なアクセス許可を付与するポリシーを指定できますが、標準的なプラクティスは、必要なアクセス許可のみを付与することです。この場合、レシピはファイルをダウンロードするだけなので、読み取り専用アクセスで十分です。

  5. [次へ] をクリックします。

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

  7. 次に、ユーザーのアクセスキーを作成します。IAM アクセスキーの詳細については、「IAM ユーザーガイド」「Managing access keys for IAM users」(IAM ユーザーのアクセスキーの管理) を参照してください。

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

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

    This is the file that you just downloaded from Amazon S3.
  2. Amazon S3 console (Amazon S3 コンソール) で、[Standard] (標準) リージョンに cookbook_bucket という名前のバケットを作成し、バケットに myfile.txt をアップロードします。

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

クックブックをセットアップするには
  1. opsworks_cookbooks 内に s3bucket という名前のディレクトリを作成し、そこに移動します。

  2. 例 1: パッケージのインストール」で説明されているとおりに Test Kitchen を初期化および設定します。

  3. .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:
  4. s3bucket: recipesenvironments にディレクトリを 2 つ追加します。

  5. 以下の 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 リソースは、レシピや他のアプリケーションによって使用される gem をインストールします。

注記

インスタンスには 2 つの Ruby インスタンスがあり、このインスタンスは通常バージョンが異なります。1 つは Chef Client によって使用される専用インスタンスです。もう 1 つは、インスタンスで実行されているアプリケーションとレシピによって使用されます。gem パッケージをインストールする際に、この相違点を理解しておくことが重要です。gem をインストールするリソースには、gem_packagechef_gem という 2 つの種類があるためです。アプリケーションまたはレシピが gem パッケージを使用する場合には、gem_package でインストールします。chef_gem は、Chef クライアントが使用する gem パッケージに限り使用します。

レシピの残りの部分は、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. サービスインターフェイスを提供する、新しい Aws::S3 オブジェクトを作成します。

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

  2. S3 オブジェクトの bucket.objects アソシエーションを呼び出します。このアソシエーションは、myfile.txt を表す myfile という名前のAws::S3::Object オブジェクトを返します。

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

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

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

  2. kitchen converge を実行します。

  3. 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 を実行してインスタンスを終了します。