使用 Amazon Web Services 账户 或 IAM 用户凭证发出请求 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon Web Services 账户 或 IAM 用户凭证发出请求

您可以使用 Amazon Web Services 账户 或 IAM 用户安全凭证向 Amazon S3 发送经身份验证的请求。本部分提供的示例演示了如何使用 Amazon SDK for Java、Amazon SDK for .NET 和 Amazon SDK for PHP 发送经身份验证的请求。有关 Amazon 可用开发工具包的列表,请转到 示例代码和库

每个 Amazon 开发工具包都使用开发工具包特有的凭证提供程序链来查找和使用凭证,并代表凭证拥有者执行操作。所有这些凭证提供程序链的共同点是,它们都会寻找您的本地 Amazon 凭证文件。

有关更多信息,请参阅以下主题:

创建本地 Amazon 凭证文件

为 Amazon 开发工具包配置凭证的最简单方法是使用 Amazon 凭证文件。如果您使用 Amazon Command Line Interface (Amazon CLI),那么您可能已经配置了本地 Amazon 凭证文件。否则,请按照以下步骤设置凭证文件:

  1. 登录 Amazon Web Services Management Console,单击 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  2. 创建一个新用户,其权限仅限于您希望您的代码有权访问的服务和操作。有关创建新用户的更多信息,请参阅创建 IAM 用户(控制台),并按照直至步骤 8 的说明进行操作。

  3. 选择 Download .csv(下载 .csv)以保存 Amazon 凭证的本地副本。

  4. 在您的计算机上,导航至主目录,并创建 .aws 目录。在基于 Unix 的系统 (例如 Linux 或 OS X) 上,它在以下位置:

    ~/.aws

    在 Windows 上,它在以下位置:

    %HOMEPATH%\.aws
  5. .aws 目录中,创建名为 credentials 的新文件。

  6. 打开您从 IAM 控制台中下载的凭证 .csv 文件,并使用以下格式将其内容复制到 credentials 文件:

    [default] aws_access_key_id = your_access_key_id aws_secret_access_key = your_secret_access_key
  7. 保存 credentials 文件,并删除在步骤 3 中下载的 .csv 文件。

您的共享凭证文件现在已在本地计算机上配置完毕,可以与 Amazon 开发工具包一起使用。

使用 Amazon 开发工具包发送经身份验证的请求

使用 Amazon 开发工具包发送经过身份验证的请求。有关发送经过身份验证的请求的更多信息,请参阅 Amazon 安全证书IAM Identity Center 身份验证

Java

要使用 Amazon Web Services 账户 或 IAM 用户凭证向 Amazon S3 发送经身份验证的请求,请执行以下操作:

  • 使用 AmazonS3ClientBuilder 类创建 AmazonS3Client 实例。

  • 运行 AmazonS3Client 方法之一,以向 Amazon S3 发送请求。客户端将通过您提供的凭证生成所需的签名并将其包含在请求中。

以下示例将执行上述任务。有关创建和测试有效示例的信息,请参阅 测试 Amazon S3 Java 代码示例

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.ListObjectsRequest; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.S3ObjectSummary; import java.io.IOException; import java.util.List; public class MakingRequests { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Get a list of objects in the bucket, two at a time, and // print the name and size of each object. ListObjectsRequest listRequest = new ListObjectsRequest().withBucketName(bucketName).withMaxKeys(2); ObjectListing objects = s3Client.listObjects(listRequest); while (true) { List<S3ObjectSummary> summaries = objects.getObjectSummaries(); for (S3ObjectSummary summary : summaries) { System.out.printf("Object \"%s\" retrieved with size %d\n", summary.getKey(), summary.getSize()); } if (objects.isTruncated()) { objects = s3Client.listNextBatchOfObjects(objects); } else { break; } } } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET

使用 Amazon Web Services 账户 或 IAM 用户凭证发送经身份验证的请求:

  • 创建 AmazonS3Client 类的实例。

  • 运行 AmazonS3Client 方法之一,以向 Amazon S3 发送请求。客户端将通过您提供的凭证生成所需的签名并将其包含在它发送到 Amazon S3 的请求中。

有关更多信息,请参阅 使用 Amazon Web Services 账户 或 IAM 用户凭证发出请求

注意
  • 您可以在不提供安全凭证的情况下创建 AmazonS3Client 客户端。使用此客户端发送的请求是匿名的请求,它们不带签名。如果为不是公开可用的资源发送了匿名请求,Amazon S3 将返回错误。

  • 您可以创建 Amazon Web Services 账户 并创建所需的用户。您还可以管理这些用户的凭证。您需要这些凭证才能执行以下示例中的任务。有关更多信息,请参阅《Amazon SDK for .NET 开发人员指南》中的配置 Amazon 凭证

    然后,您还可以将应用程序配置为主动检索配置文件和凭证,然后在创建 Amazon 服务客户端时明确使用这些凭证。有关更多信息,请参阅《Amazon SDK for .NET 开发人员指南》中的 访问应用程序中的凭证和配置文件

以下 C# 示例说明如何执行上述任务。有关运行本指南中的 .NET 示例的信息以及有关如何将凭证存储在配置文件中的说明,请参阅运行 Amazon S3 .NET 代码示例

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class MakeS3RequestTest { private const string bucketName = "*** bucket name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { using (client = new AmazonS3Client(bucketRegion)) { Console.WriteLine("Listing objects stored in a bucket"); ListingObjectsAsync().Wait(); } } static async Task ListingObjectsAsync() { try { ListObjectsRequest request = new ListObjectsRequest { BucketName = bucketName, MaxKeys = 2 }; do { ListObjectsResponse response = await client.ListObjectsAsync(request); // Process the response. foreach (S3Object entry in response.S3Objects) { Console.WriteLine("key = {0} size = {1}", entry.Key, entry.Size); } // If the response is truncated, set the marker to get the next // set of keys. if (response.IsTruncated) { request.Marker = response.NextMarker; } else { request = null; } } while (request != null); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } } }

有关有效示例,请参阅Amazon S3 对象概述存储桶概述。您可以使用 Amazon Web Services 账户 或 IAM 用户证书测试这些示例。

例如,要列出您的存储桶中的所有对象键,请参阅 以编程方式列出对象键

PHP

此部分说明如何使用版本 3 的 Amazon SDK for PHP 中的类来通过 Amazon Web Services 账户 或 IAM 用户凭证发送经身份验证的请求。本主题假定您已按照使用Amazon SDK for PHP和运行 PHP 示例的说明执行操作,并正确安装了Amazon SDK for PHP。

以下 PHP 示例说明客户端如何使用您的安全凭证发出请求以列出您的账户的所有存储桶。

require 'vendor/autoload.php'; use Aws\S3\Exception\S3Exception; use Aws\S3\S3Client; $bucket = '*** Your Bucket Name ***'; $s3 = new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', ]); // Retrieve the list of buckets. $result = $s3->listBuckets(); try { // Retrieve a paginator for listing objects. $objects = $s3->getPaginator('ListObjects', [ 'Bucket' => $bucket ]); echo "Keys retrieved!" . PHP_EOL; // Print the list of objects to the page. foreach ($objects as $object) { echo $object['Key'] . PHP_EOL; } } catch (S3Exception $e) { echo $e->getMessage() . PHP_EOL; }
注意

您可以在不提供安全凭证的情况下创建 S3Client 客户端。使用此客户端发送的请求是匿名的请求,它们不带签名。如果为不是公开可用的资源发送了匿名请求,Amazon S3 将返回错误。有关更多信息,请参阅 Amazon SDK for PHP 文档 中的 创建匿名客户端

有关有效示例,请参阅Amazon S3 对象概述。您可以使用 Amazon Web Services 账户 或 IAM 用户凭证测试这些示例。

有关列出存储桶中的对象键的示例,请参阅以编程方式列出对象键

Ruby

使用 Amazon SDK for Ruby 的版本 3 调用 Amazon S3 之前,必须设置 Amazon 访问凭证以便开发工具包用来验证您对存储桶和对象的访问权限。如果您在本地系统上的 Amazon 凭证配置文件中设置了共享凭证,则适用于 Ruby 的开发工具包的版本 3 可以在无需您在代码中声明这些凭证的情况下使用它们。有关设置共享凭证的更多信息,请参阅使用 Amazon Web Services 账户 或 IAM 用户凭证发出请求

以下 Ruby 代码段使用本地计算机上凭证文件中的共享 Amazon 凭证,对要获取特定存储桶中的所有对象键名的请求进行身份验证。它将执行以下操作:

  1. 创建 Aws::S3::Client 类的实例。

  2. 使用 list_objects_v2Aws::S3::Client 方法,通过枚举存储桶中的对象向 Amazon S3 发出请求。客户端将根据计算机上 Amazon 凭证文件中的凭证生成所需的签名值,并将其包含在发送给 Amazon S3 的请求中。

  3. 将对象键名阵列打印到终端。

# Prerequisites: # - An existing Amazon S3 bucket. require "aws-sdk-s3" # @param s3_client [Aws::S3::Client] An initialized Amazon S3 client. # @param bucket_name [String] The bucket's name. # @return [Boolean] true if all operations succeed; otherwise, false. # @example # s3_client = Aws::S3::Client.new(region: 'us-west-2') # exit 1 unless list_bucket_objects?(s3_client, 'doc-example-bucket') def list_bucket_objects?(s3_client, bucket_name) puts "Accessing the bucket named '#{bucket_name}'..." objects = s3_client.list_objects_v2( bucket: bucket_name, max_keys: 50 ) if objects.count.positive? puts "The object keys in this bucket are (first 50 objects):" objects.contents.each do |object| puts object.key end else puts "No objects found in this bucket." end return true rescue StandardError => e puts "Error while accessing the bucket named '#{bucket_name}': #{e.message}" return false end # Example usage: def run_me region = "us-west-2" bucket_name = "BUCKET_NAME" s3_client = Aws::S3::Client.new(region: region) exit 1 unless list_bucket_objects?(s3_client, bucket_name) end run_me if $PROGRAM_NAME == __FILE__

即使没有本地 Amazon 凭证文件,您仍可以创建 Aws::S3::Client 资源并针对 Amazon S3 存储桶和对象运行代码。使用适用于 Ruby 的开发工具包的版本 3 发送的请求是匿名的,默认情况下没有签名。如果为不是公开可用的资源发送了匿名请求,Amazon S3 将返回错误。

可以针对适用于 Ruby 的开发工具包应用程序使用并扩展前一个代码段,如下面的更可靠的示例所示。

# Prerequisites: # - An existing Amazon S3 bucket. require "aws-sdk-s3" # @param s3_client [Aws::S3::Client] An initialized Amazon S3 client. # @param bucket_name [String] The bucket's name. # @return [Boolean] true if all operations succeed; otherwise, false. # @example # s3_client = Aws::S3::Client.new(region: 'us-west-2') # exit 1 unless list_bucket_objects?(s3_client, 'doc-example-bucket') def list_bucket_objects?(s3_client, bucket_name) puts "Accessing the bucket named '#{bucket_name}'..." objects = s3_client.list_objects_v2( bucket: bucket_name, max_keys: 50 ) if objects.count.positive? puts "The object keys in this bucket are (first 50 objects):" objects.contents.each do |object| puts object.key end else puts "No objects found in this bucket." end return true rescue StandardError => e puts "Error while accessing the bucket named '#{bucket_name}': #{e.message}" return false end # Example usage: def run_me region = "us-west-2" bucket_name = "BUCKET_NAME" s3_client = Aws::S3::Client.new(region: region) exit 1 unless list_bucket_objects?(s3_client, bucket_name) end run_me if $PROGRAM_NAME == __FILE__
Go

以下示例使用由 SDK for Go 从共享凭证文件中自动加载的 Amazon 凭证。

package main import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" ) // main uses the AWS SDK for Go V2 to create an Amazon Simple Storage Service // (Amazon S3) client and list up to 10 buckets in your account. // This example uses the default settings specified in your shared credentials // and config files. func main() { sdkConfig, err := config.LoadDefaultConfig(context.TODO()) if err != nil { fmt.Println("Couldn't load default configuration. Have you set up your AWS account?") fmt.Println(err) return } s3Client := s3.NewFromConfig(sdkConfig) count := 10 fmt.Printf("Let's list up to %v buckets for your account.\n", count) result, err := s3Client.ListBuckets(context.TODO(), &s3.ListBucketsInput{}) if err != nil { fmt.Printf("Couldn't list buckets for your account. Here's why: %v\n", err) return } if len(result.Buckets) == 0 { fmt.Println("You don't have any buckets!") } else { if count > len(result.Buckets) { count = len(result.Buckets) } for _, bucket := range result.Buckets[:count] { fmt.Printf("\t%v\n", *bucket.Name) } } }

相关资源