web-dev-qa-db-ja.com

C#を使用してS3バケットからオブジェクトをダウンロードする

次の問題に直面しているS3バケットからオブジェクトをダウンロードしようとしていますリクエストに含まれるセキュリティトークンが無効です。間違いのある箇所を確認して修正してください.

以下は私のコードです。1.一時的な認証を取得します。

main()    
{
    string path = "http://XXX.XXX.XXX./latest/meta-data/iam/security-credentials/EC2_WLMA_Permissions";

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
                request.Method = "GET";
                request.ContentType = "application/json";
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                string result = string.Empty;
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    result = reader.ReadToEnd();
                    dynamic metaData = JsonConvert.DeserializeObject(result);
                    _awsAccessKeyId = metaData.AccessKeyId;
                    _awsSecretAccessKey = metaData.SecretAccessKey;
                }
}
  1. SessionAWSCredentialsインスタンスを作成します。

    SessionAWSCredentials tempCredentials =
                     GetTemporaryCredentials(_awsAccessKeyId, _awsSecretAccessKey);
    

    // GetTemporaryCredentialsメソッド:

       private static SessionAWSCredentials GetTemporaryCredentials(
                        string accessKeyId, string secretAccessKeyId)
        {             
    
            AmazonSecurityTokenServiceClient stsClient =
            new AmazonSecurityTokenServiceClient(accessKeyId,
                                                     secretAccessKeyId);
            Console.WriteLine(stsClient.ToString());
            GetSessionTokenRequest getSessionTokenRequest =
                                             new GetSessionTokenRequest();
    
            getSessionTokenRequest.DurationSeconds = 7200; // seconds
            GetSessionTokenResponse sessionTokenResponse =
                          stsClient.GetSessionToken(getSessionTokenRequest);
    
            Console.WriteLine(sessionTokenResponse.ToString());
            Credentials credentials = sessionTokenResponse.Credentials;
            Console.WriteLine(credentials.ToString());
    
            SessionAWSCredentials sessionCredentials =
                new SessionAWSCredentials(credentials.AccessKeyId,
                                          credentials.SecretAccessKey,
                                          credentials.SessionToken);
    
    
            return sessionCredentials;
        }
    
  2. AmazonS3Clientを使用してS3からファイルを取得します。

    using (IAmazonS3 client = new AmazonS3Client(tempCredentials,RegionEndpoint.USEast1))                        
        {
                        GetObjectRequest request = new GetObjectRequest();
                        request.BucketName = "bucketName" + @"/" + "foldername";
                        request.Key = "Terms.docx";
                        GetObjectResponse response = client.GetObject(request);
                        response.WriteResponseStreamToFile("C:\\MyFile.docx");
        }
    
6
shanthi

S3とのインターフェースのためにもう少し簡単なことを行います(ダウンロードとアップロード)

より複雑なアプローチを行ったようです。代わりにTransferUtilityを使用してみてください:

_TransferUtility fileTransferUtility =
    new TransferUtility(
        new AmazonS3Client("ACCESS-KEY-ID", "SECRET-ACCESS-KEY", Amazon.RegionEndpoint.CACentral1));

// Note the 'fileName' is the 'key' of the object in S3 (which is usually just the file name)
fileTransferUtility.Download(filePath, "my-bucket-name", fileName);
_

注:TransferUtility.Download()は、filePath引数で指定されたパスにファイルをダウンロードするため、voidを返します。これは期待していたものとは少し異なる場合がありますが、後でそのパスに対してFileStreamを開いて、必要なファイルを操作できます。例えば:

_using (FileStream fileDownloaded = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    // Do stuff with our newly downloaded file
}
_
14
Omar Himada
Bucketname, Accesskey and secretkey, I took from web config. You could type manually.

 public void DownloadObject(string imagename)
    {
        RegionEndpoint bucketRegion = RegionEndpoint.USEast1;
        IAmazonS3 client = new AmazonS3Client(bucketRegion);

        string accessKey = System.Configuration.ConfigurationManager.AppSettings["AWSAccessKey"];
        string secretKey = System.Configuration.ConfigurationManager.AppSettings["AWSSecretKey"];            
        AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey), Amazon.RegionEndpoint.USEast1);
        string objectKey = "EMR" + "/" + imagename;
        //EMR is folder name of the image inside the bucket 
        GetObjectRequest request = new GetObjectRequest();
        request.BucketName = System.Configuration.ConfigurationManager.AppSettings["bucketname"];      
        request.Key = objectKey;
        GetObjectResponse response = s3Client.GetObject(request);         
        response.WriteResponseStreamToFile("D:\\Test\\"+ imagename);

    }

//> D:\ Test \はローカルファイルパスです。

1
Pergin Sheni