Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download Objects from S3 Bucket using c#

Tags:

c#

amazon-s3

Im trying to download object from S3 bucket facing below issue The Security token included in the request is Invalid . Please check and correct where is the mistake.

Below is my code 1. Get Temporary credentails:

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. Create SessionAWSCredentials instance:

    SessionAWSCredentials tempCredentials =
                     GetTemporaryCredentials(_awsAccessKeyId, _awsSecretAccessKey);
    

    //GetTemporaryCredentials method:

       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. Get files from S3 using AmazonS3Client:

    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");
        }
    
like image 766
shanthi Avatar asked Apr 02 '18 15:04

shanthi


People also ask

How do I download S3 bucket items?

You can download an object from an S3 bucket in any of the following ways: Select the object and choose Download or choose Download as from the Actions menu if you want to download the object to a specific folder. If you want to download a specific version of the object, select the Show versions button.

How do I download multiple files from S3 bucket to local?

If you have Visual Studio with the AWS Explorer extension installed, you can also browse to Amazon S3 (step 1), select your bucket (step 2), select al the files you want to download (step 3) and right click to download them all (step 4).


1 Answers

We do something a little simpler for interfacing with S3 (downloads and uploads)

It looks like you went the more complex approach. You should try just using the TransferUtility instead:

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

NOTE: TransferUtility.Download() returns void because it downloads the file to the path specified in the filePath argument. This may be a little different than what you were expecting but you can still open a FileStream to that path afterwards and manipulate the file all you want. For example:

using (FileStream fileDownloaded = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    // Do stuff with our newly downloaded file
}
like image 62
Omar Himada Avatar answered Sep 20 '22 14:09

Omar Himada