AWS SDK for Ruby
開発者ガイド

Ruby でバケットポリシーを作成する

この例では、AWS SDK for Ruby を使用して以下を行う方法を示しています。

  1. Amazon Simple Storage Service (Amazon S3) でバケットを作成します。

  2. バケットポリシーを定義します。

  3. ポリシーをバケットに追加します。

  4. ポリシーを変更します。

  5. ポリシーをバケットから削除します。

  6. バケットを削除します。

この例の完全なコードについては、完全な例を参照してください。

前提条件タスク

この例をセットアップして実行するには、まず以下の条件を満たす必要があります。

  1. AWS SDK for Ruby をインストールします。詳細については、「AWS SDK for Ruby のインストール」を参照してください。

  2. AWS のサービスおよびリソースへのアクセスを確認するために AWS SDK for Ruby が使用する、AWS アクセス認証情報を設定します。詳細については、「AWS SDK for Ruby の設定」を参照してください。

AWS 認証情報が、この例で説明されている AWS のアクションおよびリソースへのアクセス権を持つ AWS Identity and Access Management (IAM) のエンティティにマッピングされることを確認してください。

この例では、認証情報が AWS 認証情報プロファイルのファイル、またはローカルシステムの AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY 環境変数で設定されていることを前提としています。

SDK を設定する

この例の SDK を設定するには、require ステートメントを追加して、AWS SDK for Ruby for Amazon S3 から提供されるクラスとメソッドを使用できるようにします。その後、バケットを作成する AWS リージョンで Aws::S3::Client のオブジェクトを作成します。このコードは、us-west-2 リージョンに Aws::S3::Client オブジェクトを作成します。

require 'aws-sdk' s3 = Aws::S3::Client.new(region: "us-west-2")

バケットの作成

バケット名を指定してバケット作成メソッドを呼び出します。このコードでは、bucket という名前の変数を使用してバケット名を表します。example-bucket-name をバケット名に置き換えてください。

注記

バケット名は AWS アカウントで一意であるだけでなく、Amazon S3 で一意である必要があります。

既に使用するバケットある場合、create_bucket を呼び出す必要はありません。

bucket = "example-bucket-name" s3.create_bucket(bucket: bucket)

バケットポリシーの定義

ポリシーを表す Ruby ハッシュを宣言します。次に、ハッシュで to_json メソッドを呼び出して JSON オブジェクトに変換します。このコードは、ポリシー定義を含む policy という変数を使用します。このポリシーは、指定されたユーザーが example-bucket-name (#{bucket} で表される) を完全に制御できます。arn:aws:iam::111122223333:user/Alice を、使用する AWS Identity and Access Management (IAM) ユーザーの Amazon Resource Name (ARN) に置き換えます。

policy = { "Version" => "2012-10-17", "Statement" => [ { "Effect" => "Allow", "Principal" => { "AWS" => [ "arn:aws:iam::111122223333:user/Alice" ] }, "Action" => "s3:*", "Resource" => [ "arn:aws:s3:::#{bucket}" ] } ] }.to_json

定義できるポリシーの種類の例については、Amazon S3 Developer Guideの「バケットポリシーの例」を参照してください。

ポリシーをバケットに追加する

バケットの名前とポリシー定義を指定して、put_bucket_policy メソッドを呼び出します。

s3.put_bucket_policy( bucket: bucket, policy: policy )

ポリシーの変更

put_bucket_policy メソッドを呼び出してポリシーを完全に置き換えることもできます。ただし、既存のポリシーの増分更新を行うこともできます。こうすることで、作成が必要なコードの量を減らすことができます。これを行うには、get_bucket_policy メソッドを呼び出すことで、現在のポリシーを取得します。次に、Ruby ハッシュに返された JSON オブジェクトを解析します。その後、ポリシーに対する増分変更を行います。たとえば、このコードは IAM エンティティの ARN を変更します。変更を行った後は、put_bucket_policy メソッドを再度呼び出します。変更したポリシーをバケットに適用する前に、ハッシュで to_json メソッドを呼び出して JSON オブジェクトに変換して戻してください。

policy_string = s3.get_bucket_policy(bucket: bucket).policy.read policy_json = JSON.parse(policy_string) policy_json["Statement"][0]["Principal"]["AWS"] = "arn:aws:iam::111122223333:root" s3.put_bucket_policy( bucket: bucket, policy: policy_json.to_json )

クリーンアップ

バケットからポリシーを削除するには、バケット名を指定して delete_bucket_policy メソッドを呼び出します。

バケットを削除するには、バケット名を指定して delete_bucket メソッドを呼び出します。

s3.delete_bucket_policy(bucket: bucket) s3.delete_bucket(bucket: bucket)

完全な例

この例の完全なコードを次に示します。

require 'aws-sdk' s3 = Aws::S3::Client.new(region: "us-west-2") bucket = "example-bucket-name" s3.create_bucket(bucket: bucket) policy = { "Version" => "2012-10-17", "Statement" => [ { "Effect" => "Allow", "Principal" => { "AWS" => [ "arn:aws:iam::111122223333:user/Alice" ] }, "Action" => "s3:*", "Resource" => [ "arn:aws:s3:::#{bucket}" ] } ] }.to_json s3.put_bucket_policy( bucket: bucket, policy: policy ) policy_string = s3.get_bucket_policy(bucket: bucket).policy.read policy_json = JSON.parse(policy_string) policy_json["Statement"][0]["Principal"]["AWS"] = "arn:aws:iam::111122223333:root" s3.put_bucket_policy( bucket: bucket, policy: policy_json.to_json ) s3.delete_bucket_policy(bucket: bucket) s3.delete_bucket(bucket: bucket)