Grant EC2 instance access to S3 Bucket

I want to grant my ec2 instance access to an s3 bucket.

On this ec2 instance, a container with my application is launched. Now I don't get permission on the s3 bucket.

This is my bucket policy

{
"Version": "2012-10-17",
"Id": "Policy1462808223348",
"Statement": [
    {
        "Sid": "Stmt1462808220978",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::714656454815:role/ecsInstanceRole"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::bucket-name/*",
        "Condition": {
            "IpAddress": {
                "aws:SourceIp": "private-ip/32"
            }
        }
    }
]
}

But it doesn't work until I give the bucket the permission for everyone to access it.

I try to curl the file in the s3 bucket from inside the ec2 instance but this doesn't work either.

Answers 1

  • There is no direct way of granting "EC2" instance access to AWS server, but you can try the following.

    1. Create a new user in AWS IAM, and download the credentials file.
    2. This user will represent your EC2 server.
    3. Provide the user with permissions to your S3 Bucket.
    4. Next, place the credentials file in the following location:-
      EC2 - Windows Instance:
      a. Place the credentials file anywhere you wish. (e.g. C:/credentials)
      b. Create an environment variable AWS_CREDENTIAL_PROFILES_FILE and put the value as the path where you put your credentials file (e.g. C:/credentials)
      EC2 - Linux Instance
      a. Follow steps from windows instance
      b. Create a folder .aws inside your app-server's root folder (e.g. /usr/share/tomcat6).
      c. Create a symmlink between your environment variable and your .aws folder sudo ln -s $AWS_CREDENTIAL_PROFILES_FILE /usr/share/tomcat6/.aws/credentials

    5. Now that your credentials file is placed, you can use Java code to access the bucket.
      NOTE: AWS-SDK libraries are required for this

    
    
        AWSCredentials credentials = null;
                try {
                    credentials = new ProfileCredentialsProvider().getCredentials();
                } catch (Exception e) {
                    LOG.error("Unable to load credentials " + e);
                    failureMsg = "Cannot connect to file server.";
                    throw new AmazonClientException(
                            "Cannot load the credentials from the credential profiles file. " +
                            "Please make sure that your credentials file is at the correct " +
                            "location (environment variable : AWS_CREDENTIAL_PROFILES_FILE), and is in valid format.",
                            e);
                }
    
                AmazonS3 s3 = new AmazonS3Client(credentials);
                Region usWest2 = Region.getRegion(Regions.US_WEST_2);
                s3.setRegion(usWest2);
        ObjectListing objectListing = s3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix));
    
    

    Where bucketName = [Your Bucket Name]
    and prefix = [your folder structure inside your bucket, where your file(s) are contained]

    Hope that helps. Also, if you are not using Java, you can check out AWS-SDKs in other programming languages too.


Related Articles