UnityでS3を操作する

AWS Cognitoを利用します。Cognitoを使って、IdentityPoolId のみでアクセス権限を取得できます。

下記は、AWS Tool for Unityにあるサンプルファイルの中身を抜粋(一部改)しています。

初期設定に必要なコード

String IdentityPoolId ="us-east-1:XXXXXXXXXXXXXXXXXXXX";
public string CognitoIdentityRegion = RegionEndpoint.USEast1.SystemName;
private RegionEndpoint _CognitoIdentityRegion{
    get { return RegionEndpoint.GetBySystemName(CognitoIdentityRegion); }
}
private AWSCredentials Credentials{
    get{
        if (_credentials == null)
            _credentials = new CognitoAWSCredentials(IdentityPoolId, _CognitoIdentityRegion);
    return _credentials;
    }
}
private IAmazonS3 Client{
    get{
        if (_s3Client == null){
            _s3Client = new AmazonS3Client(Credentials, _S3Region);
        }
        return _s3Client;
    }
}

S3に置いてあるバケットの情報(リスト)を入手する

public void GetObjects()

        {
 
            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";
                }
            });
        }

S3の特定のファイルについて取得する

private void GetObject(string S3BucketName,string SampleFileName)

        {
            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;
                }
            });
        }

S3にデータを置く

public void PostObject(string S3BucketName)

        {
            ResultText.text = "Retrieving the file";
            string fileName = GetFileHelper();
             
            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());
                }
            });
        }