

适用于 Unity 的 AWS 移动 SDK 现已包含在 适用于 .NET 的 AWS SDK。本指南引用适用于 Unity 的 Mobile SDK 的存档版本。有关更多信息，请参阅 [适用于 Unity 的 AWS 移动 SDK 是什么？](what-is-unity-plugin.md)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Simple Storage Service (S3)
<a name="s3"></a>

Amazon Simple Storage Service (Amazon S3) 为开发人员和 IT 团队提供安全、持久、高度可扩展的对象存储。Unity 开发人员可以利用 S3 来动态加载其游戏所使用的资产。这使得从一开始就能更快地从应用程序商店下载游戏。

有关 S3 的更多信息，请参阅 [Amazon S3](https://aws.amazon.com/s3/)。

有关 AWS S3 区域可用性的信息，请参阅 [AWS 服务区域可用性](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

**注意**  
本文档中的一些示例假设使用名为的文本框变量 ResultText 来显示跟踪输出。

## 创建和配置 S3 存储桶
<a name="create-and-configure-an-s3-bucket"></a>

Amazon S3 可将您的资源存储到 Amazon S3 存储桶 (存在于某个特定[区域](https://docs.aws.amazon.com/general/latest/gr/rande.html)的云存储容器)。每个 Amazon S3 存储桶必须具有一个全局唯一名称。您可以使用 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)创建存储桶。

### 创建 S3 存储桶
<a name="create-an-s3-bucket"></a>

1. 登录 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)，然后单击 **Create Bucket**。

1. 输入存储桶的名称，选择一个区域，然后单击 **Create**。

### 设置 S3 权限
<a name="set-permissions-for-s3"></a>

默认 IAM 角色策略会授予您的应用程序访问 Amazon Mobile Analytics 和 Amazon Cognito Sync 的权限。为了让您的 Cognito 身份池能够访问 Amazon S3，您必须修改身份池的角色。

1. 转至 [Identity and Access Management Console](https://console.aws.amazon.com/iam/home)，然后单击左窗格中的 **Roles**。

1. 在搜索框中键入您的身份池名称。将列出两个角色：一个用于未经身份验证的用户，另一个用于经过身份验证的用户。

1. 单击用于未经过身份验证的用户的角色 (身份池名称后附加有“unauth”)。

1. 单击 **Create Role Policy**，选择 **Policy Generator**，然后单击 **Select**。

1. 在**编辑权限**页面上，输入下图所示的设置，用您自己的资源名称替换 Amazon 资源名称 (ARN)。S3 存储桶的 ARN 类似 `arn:aws:s3:::examplebucket/*`，由存储桶所在的区域和存储桶的名称构成。下面显示的设置将赋予您的身份池对指定存储桶执行所有操作的完全访问权限。  
![\[Edit Permissions interface for AWS policy creation, showing options for Amazon S3 access control.\]](http://docs.aws.amazon.com/zh_cn/mobile/sdkforunity/developerguide/images/edit-permissions.png)

1. 单击 **Add Statement** 按钮，然后单击 **Next Step**。

1. 向导将向您显示生成的配置。单击**应用策略**。

有关授予访问 S3 的权限的更多信息，请参阅[授予访问 Amazon S3 存储桶的权限](http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket)。

### 从控制台上传文件
<a name="upload-files-from-the-console"></a>

将测试文件上传到您的存储桶：

1. 在 S3 控制台上的存储桶视图中，单击 **Upload**。

1. 单击 **Add Files**，然后选择一个要上传的测试文件。在本教程中，我们假设您上传一个名为 `myImage.jpg` 的图像。

1. 选择测试图像后，单击 **Start Upload**。

### (可选) 配置针对 S3 请求的签名版本
<a name="optional-configure-the-signature-version-for-s3-requests"></a>

与 Amazon S3 的每一次交互都是经身份验证的或匿名的。AWS 使用签名版本 4 或签名版本 2 算法来对服务调用进行身份验证。

2014 年 1 月之后创建的所有新的 AWS 区域仅支持签名版本 4。但是，许多较旧的区域仍支持签名版本 4 和签名版本 2 请求。

如果您的存储桶位于不支持[本页](https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html)所列签名版本 2 请求的区域之一，则必须设置 AWSConfigs S3。 UseSignatureVersion4 属性变为 “真”。

有关 AWS 签名版本的更多信息，请参阅[对请求进行身份验证（AWS 签名版本 4）](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)。

## 创建 Amazon S3 客户端
<a name="create-the-amazon-s3-client"></a>

要使用 Amazon S3，我们首先需要创建一个 Amazons3Client 实例，该实例引用你之前创建的 Cognit AWSCredentials o 实例：

```
AmazonS3Client S3Client = new AmazonS3Client (credentials);
```

`AmazonS3Client` 类是高级 S3 API 的入口点。

## 列出存储桶
<a name="list-buckets"></a>

要列出 AWS 账户中的存储桶，请调用 `AmazonS3Client.ListBucketsAsync` 方法，如以下示例代码中所示：

```
// ResultText is a label used for displaying status information
ResultText.text = "Fetching all the Buckets";
 Client.ListBucketsAsync(new ListBucketsRequest(), (responseObject) =>
 {
     ResultText.text += "\n";
     if (responseObject.Exception == null)
     {
         ResultText.text += "Got Response \nPrinting now \n";
         responseObject.Response.Buckets.ForEach((s3b) =>
         {
             ResultText.text += string.Format("bucket = {0}, created date = {1} \n",
             s3b.BucketName, s3b.CreationDate);
         });
     }
     else
     {
         ResultText.text += "Got Exception \n";
     }
 });
```

## 列出对象
<a name="list-objects"></a>

要列出一个存储桶中的所有对象，请调用 `AmazonS3Client.ListObjectsAsync` 方法，如以下示例代码中所示：

```
// ResultText is a label used for displaying status information
ResultText.text = "Fetching all the Objects from " + S3BucketName;

var request = new ListObjectsRequest()
{
    BucketName = S3BucketName
};

Client.ListObjectsAsync(request, (responseObject) =>
{
    ResultText.text += "\n";
    if (responseObject.Exception == null)
    {
        ResultText.text += "Got Response \nPrinting now \n";
        responseObject.Response.S3Objects.ForEach((o) =>
        {
            ResultText.text += string.Format("{0}\n", o.Key);
        });
    }
    else
    {
        ResultText.text += "Got Exception \n";
    }
});
```

## 下载对象
<a name="download-an-object"></a>

要下载对象，请创建一个 GetObjectRequest，指定存储桶名称和密钥，然后将该对象传递给客户端。 GetObjectAsync:

```
private void GetObject()
{
    ResultText.text = string.Format("fetching {0} from bucket {1}",
    SampleFileName, S3BucketName);
    Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) =>
    {
       string data = null;
       var response = responseObj.Response;
       if (response.ResponseStream != null)
       {
          using (StreamReader reader = new StreamReader(response.ResponseStream))
          {
             data = reader.ReadToEnd();
          }

          ResultText.text += "\n";
          ResultText.text += data;
       }
  });
}
```

GetObjectAsync 取一个实例 GetObjectRequest、一个回调和一个 AsyncOptions 实例。回调的类型必须为：`AmazonServiceCallback<GetObjectRequest, GetObjectResponse>`。该 AsyncOptions 实例是可选的。如果指定，它将决定是否将在主线程上运行回调。

## 上传对象
<a name="upload-an-object"></a>

要上传对象，请将您的对象写入流，创建一个新的对象 PostObjectRequest 并指定密钥、存储桶名称和流数据。

适用于 Unity 的 AWS SDK 使用不支持 HTTP PUT 操作的 WWW HTTP 客户端。要想将对象上传到您的 S3 存储桶，需要使用 S3 的浏览器 Post，如下所示。

```
public void PostObject(string fileName)
{
    ResultText.text = "Retrieving the file";

    var stream = new FileStream(Application.persistentDataPath +
    Path.DirectorySeparatorChar + fileName,
    FileMode.Open, FileAccess.Read, FileShare.Read);

    ResultText.text += "\nCreating request object";
    var request = new PostObjectRequest()
    {
        Bucket = S3BucketName,
        Key = fileName,
        InputStream = stream,
        CannedACL = S3CannedACL.Private
    };

    ResultText.text += "\nMaking HTTP post call";

    Client.PostObjectAsync(request, (responseObj) =>
    {
        if (responseObj.Exception == null)
        {
            ResultText.text += string.Format("\nobject {0} posted to bucket {1}",
            responseObj.Request.Key, responseObj.Request.Bucket);
        }
        else
        {
            ResultText.text += "\nException while posting the result object";
            ResultText.text += string.Format("\n receieved error {0}",
            responseObj.Response.HttpStatusCode.ToString());
        }
    });
}
```