本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用存储桶策略管理对 Amazon S3 存储桶的访问
您可以设置、获取或删除存储桶策略来管理对 Amazon S3 存储桶的访问。
先决条件
在开始之前,建议您先阅读开始使用适用于 C++ 的 AWS SDK。
下载示例代码并按代码示例入门中所述构建解决方案。
要运行这些示例,您的代码用于发出请求的用户配置文件必须在 AWS 中具有适当的权限(用于服务和操作)。有关更多信息,请参阅提供 AWS 凭证。
设置存储桶策略
您可以为特定 S3 存储桶设置存储桶策略,方法是调用 S3Client 的 PutBucketPolicy 函数并在 PutBucketPolicyRequest 为其提供存储桶名称和策略的 JSON 表示形式。
代码
//! Build a policy JSON string. /*! \param userArn: Aws user Amazon Resource Name (ARN). For more information, see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns. \param bucketName: Name of a bucket. \return String: Policy as JSON string. */ Aws::String getPolicyString(const Aws::String &userArn, const Aws::String &bucketName) { return "{\n" " \"Version\":\"2012-10-17\",\n" " \"Statement\":[\n" " {\n" " \"Sid\": \"1\",\n" " \"Effect\": \"Allow\",\n" " \"Principal\": {\n" " \"AWS\": \"" + userArn + "\"\n"" },\n" " \"Action\": [ \"s3:getObject\" ],\n" " \"Resource\": [ \"arn:aws:s3:::" + bucketName + "/*\" ]\n" " }\n" " ]\n" "}"; }
bool AwsDoc::S3::putBucketPolicy(const Aws::String &bucketName, const Aws::String &policyBody, const Aws::S3::S3ClientConfiguration &clientConfig) { Aws::S3::S3Client s3Client(clientConfig); std::shared_ptr<Aws::StringStream> request_body = Aws::MakeShared<Aws::StringStream>(""); *request_body << policyBody; Aws::S3::Model::PutBucketPolicyRequest request; request.SetBucket(bucketName); request.SetBody(request_body); Aws::S3::Model::PutBucketPolicyOutcome outcome = s3Client.PutBucketPolicy(request); if (!outcome.IsSuccess()) { std::cerr << "Error: putBucketPolicy: " << outcome.GetError().GetMessage() << std::endl; } else { std::cout << "Set the following policy body for the bucket '" << bucketName << "':" << std::endl << std::endl; std::cout << policyBody << std::endl; } return outcome.IsSuccess(); }
注意
Aws::Utils::Json::JsonValue 实用程序类可用于帮助您构造要传递给 PutBucketPolicy 的有效 JSON 对象。
请参阅 Github
获取存储桶策略
要检索 Amazon S3 存储桶的策略,请调用 S3Client 的 GetBucketPolicy 函数,并在 GetBucketPolicyRequest 中向其传递存储桶名称。
代码
bool AwsDoc::S3::getBucketPolicy(const Aws::String &bucketName, const Aws::S3::S3ClientConfiguration &clientConfig) { Aws::S3::S3Client s3Client(clientConfig); Aws::S3::Model::GetBucketPolicyRequest request; request.SetBucket(bucketName); Aws::S3::Model::GetBucketPolicyOutcome outcome = s3Client.GetBucketPolicy(request); if (!outcome.IsSuccess()) { const Aws::S3::S3Error &err = outcome.GetError(); std::cerr << "Error: getBucketPolicy: " << err.GetExceptionName() << ": " << err.GetMessage() << std::endl; } else { Aws::StringStream policy_stream; Aws::String line; outcome.GetResult().GetPolicy() >> line; policy_stream << line; std::cout << "Retrieve the policy for bucket '" << bucketName << "':\n\n" << policy_stream.str() << std::endl; } return outcome.IsSuccess(); }
请参阅 Github
删除存储桶策略
要删除存储桶策略,请调用 S3Client 的 DeleteBucketPolicy 函数,并在 DeleteBucketPolicyRequest 中为其提供桶名称。
代码
bool AwsDoc::S3::deleteBucketPolicy(const Aws::String &bucketName, const Aws::S3::S3ClientConfiguration &clientConfig) { Aws::S3::S3Client client(clientConfig); Aws::S3::Model::DeleteBucketPolicyRequest request; request.SetBucket(bucketName); Aws::S3::Model::DeleteBucketPolicyOutcome outcome = client.DeleteBucketPolicy(request); if (!outcome.IsSuccess()) { const Aws::S3::S3Error &err = outcome.GetError(); std::cerr << "Error: deleteBucketPolicy: " << err.GetExceptionName() << ": " << err.GetMessage() << std::endl; } else { std::cout << "Policy was deleted from the bucket." << std::endl; } return outcome.IsSuccess(); }
即使存储桶中还没有策略,该函数也会成功。如果您指定的存储桶名称不存在,或者您没有访问该存储桶的权限,会引发 AmazonServiceException。
请参阅 Github
更多信息
-
《Amazon Simple Storage Service API 参考》中的 PutBucketPolicy
-
《Amazon Simple Storage Service API 参考》中的 GetBucketPolicy
-
《Amazon Simple Storage Service API 参考》中的 DeleteBucketPolicy
-
《Amazon Simple Storage Service 用户指南》中的访问策略语言概述
-
《Amazon Simple Storage Service 用户指南》中的存储桶策略示例