メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

IAM ユーザーの一時的な認証情報を使用したリクエストの実行 – AWS SDK for Ruby

IAM ユーザーまたは AWS アカウントは、AWS SDK for Ruby を使用して一時的なセキュリティ認証情報をリクエストし (「リクエストの実行」を参照)、その認証情報を使用して、Amazon S3 にアクセスできます。これらの認証情報は、セッションの有効期間が過ぎると失効します。デフォルトでは、セッションの有効期間は 1 時間です。IAM ユーザーの認証情報を使用する場合、一時的なセキュリティ認証情報をリクエストするときに、有効期間を 1 ~ 36 時間の間で指定できます。

IAM ユーザーの一時的なセキュリティ認証情報を使用したリクエストの実行

1

新しい AWS Security Token Service (AWS STS) クライアントを作成し、Aws::STS::Client.new で一時的な認証情報を取得します。

2

新しいユーザー用の新しい IAM ユーザーポリシーを作成し、バケット内のコンテンツをリストする一時的なアクセス許可を付与します。

3

一時的な認証情報を使用して Amazon S3 クライアントを作成し、一時的な認証情報を使用して、指定されたバケットの内容をリストします。失効した認証情報を使用してリクエストを送信すると、Amazon S3 はエラーを返します。

以下の Ruby コード例は、前述のタスクの例です。

Copy
require 'aws-sdk-s3' # Create new STS client and get temporary credentials sts = Aws::STS::Client.new(region: region) temp_creds = sts.get_federation_token({ duration_seconds: 3600, name: user_name, policy: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListBucket\",\"Resource\":\"arn:aws:s3:::#{bucket_name}\"}]}", }) credentials = temp_creds.credentials =begin access_key_id = credentials.access_key_id # String expiration = credentials.expiration # Time secret_access_key = credentials.secret_access_key # String session_token = credentials.session_token # String =end # Create S3 client with temporary credentials s3 = Aws::S3::Client.new(region: region, credentials: credentials) # Get an Amazon S3 resource s3 = Aws::S3::Resource.new(region: region) # Create an array of the object keynames in the bucket, up to the first 100 bucket = s3.bucket('example_bucket').objects.collect(&:key) # Print the array to the terminal puts bucket

注記

AWS アカウントのセキュリティ認証情報を使用して一時的なセキュリティ認証情報を取得する場合、取得した一時的なセキュリティ認証情報は 1 時間だけ有効です。セッションの有効期間を指定できるのは、IAM ユーザー認証情報を使用してセッションをリクエストする場合に限ります。

次の Ruby コード例では、一時的なユーザーが、指定されたバケット内のすべてのアイテムを 1 時間リストするためのフェデレーティッドポリシーを作成します。このコード例を使用するには、AWS 認証情報に、新しい AWS STS クライアントを作成し、Amazon S3 バケットをリストするために必要なアクセス許可がある必要があります。

Copy
require 'aws-sdk-s3' USAGE = <<DOC Usage: sts_create_bucket_policy.rb -b BUCKET -u USER [-r REGION] [-d] [-h] Creates a federated policy for USER to list items in BUCKET for one hour BUCKET is required and must not already exist USER is required and if not found, is created If REGION is not supplied, defaults to us-west-2. -d gives you extra (debugging) information. -h displays this message and quits DOC $debug = false def print_debug(s) if $debug puts s end end def get_user(region, user_name, create) user = nil iam = Aws::IAM::Resource.new(region: region) if create print_debug("Trying to create new user #{user_name} in region #{region}") else print_debug("Getting user #{user_name} in region #{region}") end # First see if user exists user = iam.user(user_name) if user == nil && create user = iam.create_user(user_name: user_name) iam.wait_until(:user_exists, user_name: user_name) print_debug("Created new user #{user_name}") else print_debug("Found user #{user_name}") end user end # main region = 'us-west-2' user_name = '' bucket_name = '' i = 0 while i < ARGV.length case ARGV[i] when '-b' i += 1 bucket_name = ARGV[i] when '-u' i += 1 user_name = ARGV[i] when '-r' i += 1 region = ARGV[i] when '-d' puts 'Debugging enabled' $debug = true when '-h' puts USAGE exit 0 else puts 'Unrecognized option: ' + ARGV[i] puts USAGE exit 1 end i += 1 end if bucket_name == '' puts 'You must supply a bucket name' puts USAGE exit 1 end if user_name == '' puts 'You must supply a user name' puts USAGE exit 1 end # IAM user we allow to list S3 bucket items for an hour user = get_user(region, user_name, true) # Create new STS client and get temporary credentials sts = Aws::STS::Client.new(region: region) temp_creds = sts.get_federation_token({ duration_seconds: 3600, name: user_name, policy: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListBucket\",\"Resource\":\"arn:aws:s3:::#{bucket_name}\"}]}", }) credentials = temp_creds.credentials =begin access_key_id = credentials.access_key_id # String expiration = credentials.expiration # Time secret_access_key = credentials.secret_access_key # String session_token = credentials.session_token # String =end # Create S3 client with temporary credentials s3 = Aws::S3::Client.new(region: region, credentials: credentials) # List the items for the specified S3 bucket s3 = Aws::S3::Resource.new(region: region) begin bucket = s3.bucket(bucket_name) count = bucket.objects.count puts "Items (#{count}):" puts # List the object key bucket.objects.each do |obj| puts " Name: #{obj.key}" end rescue Aws::S3::Errors::PermanentRedirect puts puts 'The bucket is not in the ' + region + ' region' exit 1 end