

適用於 Unity 的 AWS Mobile SDK 現在已包含在 中 適用於 .NET 的 AWS SDK。本指南參考適用於 Unity 的 Mobile SDK 封存版本。如需詳細資訊，請參閱[什麼是適用於 Unity 的 AWS Mobile 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/)，然後按一下**建立儲存貯**體。

1. 輸入儲存貯體名稱，選取區域，然後按一下**建立**。

### 設定 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)，然後按一下左側窗格中**的角色**。

1. 在搜尋方塊中輸入您的身分集區名稱。將會列出兩個角色：一個用於未經驗證的使用者，另一個用於通過驗證的使用者。

1. 按一下未驗證使用者的角色 （身分集區名稱將附加不驗證）。

1. 按一下**建立角色政策**，選取**政策產生器**，然後按一下**選取**。

1. 在**編輯許可**頁面上，輸入下圖中顯示的設定，以您自己的名稱取代 Amazon Resource Name (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_tw/mobile/sdkforunity/developerguide/images/edit-permissions.png)

1. 按一下**新增陳述式**按鈕，然後按一下**下一步**。

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 主控台的儲存貯體檢視中，按一下**上傳**。

1. 按一下**新增檔案**並選取要上傳的測試檔案。在本教學課程中，我們將假設您正在上傳名為 的映像`myImage.jpg`。

1. 選取測試映像後，按一下**開始上傳**。

### （選用） 設定 S3 請求的簽章版本
<a name="optional-configure-the-signature-version-for-s3-requests"></a>

與 Amazon S3 的每次互動，可以經過驗證身分或是匿名進行。AWS 使用 Signature 第 4 版或 Signature 第 2 版演算法來驗證對服務的呼叫。

2014 年 1 月之後建立的所有新 AWS 區域僅支援 Signature 第 4 版。不過，許多較舊的區域仍然支援 Signature 第 4 版和 Signature 第 2 版請求。

如果您的儲存貯體位於[此頁面](https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html)列出的其中一個不支援 Signature 第 2 版請求的區域，您必須將 AWSConfigsS3.UseSignatureVersion4 屬性設定為「true」。

如需 AWS Signature 版本的詳細資訊，請參閱[驗證請求 (AWS Signature 第 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 執行個體，該執行個體參考您先前建立的 CognitoAWSCredentials 執行個體：

```
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、指定儲存貯體名稱和金鑰，並將物件傳遞給 Client。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 開發套件使用不支援 HTTP PUT 操作的 WWW HTTP 用戶端。若要將物件上傳至 S3 儲存貯體，您需要使用 S3 的瀏覽器貼文，如下所示。

```
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());
        }
    });
}
```