Vagrant インスタンスでの SDK Ruby の の使用 - AWS OpsWorks

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

Vagrant インスタンスでの SDK Ruby の の使用

重要

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

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

重要

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

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

EC2Amazon EC2 インスタンスで実行されているレシピは、「」で説明されているように、さらに優れたアプローチである IAMロールを使用できますでの Ruby SDK用 の使用 AWS OpsWorks スタック Linux インスタンス

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. [Next (次へ)] を選択します。

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

  7. 次に、ユーザーのアクセスキーを作成します。アクセスキーの作成の詳細については、「 ユーザーガイド」のIAM「ユーザーのアクセスキーの管理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

recipe の最初の部分では、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リソースが Ruby SDK用 のインストールを完了した後に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 を実行してインスタンスを終了します。