How to access Outpost AWS S3 Bucket using python + Boto3? - amazon-web-services

Hello all I am trying to connect s3 which in outpost, the message it prints in the console is -
The Amazon S3 console doesn’t support using virtual private cloud
(VPC) access points to access objects in your Outposts bucket. To
access Outposts bucket resources, use the AWS CLI, AWS SDK, or Amazon
S3 REST API
now all i have is a ARN & Endpoint ID , I tired this to access the s3 bucket from a ec2 that in the same outpost using the bellow code
import boto3
s3 = boto3.client(
service_name='s3'
)
arn = "arn:aws:s3-outposts:us-east-2: :outpost/ /bucket/my-bucket-name"
response = s3.get_object(Bucket=arn)
getting this error
botocore.exceptions.EndpointResolutionError: Expected an outpost type `accesspoint`, found bucket
How I can access it with python ?
if I use rest API, what is the endpoint is should use ? as the config only supports private Endpoint all I have is ARN & Endpoint ID

Related

Access two different S3 buckets with two different credentials in Spark

I have a scenario where I read data from S3 Bucket from Account 1. This works as expected as I use TemporaryAWSCredentialsProvider. I have another S3 bucket in AWS Account 2 which is where I am running Spark (Spark on EKS). How to configure credentials for Spark to access or write event logs to S3 bucket in Account 2? I was using InstanceProfileCredentialsProvider since credentials for both the buckets are different and the IAM role is configured to allow the EKS instances/pods to have access to the bucket in this account, which seems to not work as expected and I think this is because I have both InstanceProfileCredentialsProvider and TemporaryAWSCredentialsProvider in the same SparkConf which might not be allowed. Is there a way to achieve this?

How to configure access to my aws s3 bucket from aws ec2 instance via VPC

I have installed nginx with kaltura-nginx-vod module on EC2. I would like to set up private remote read-only mode to my s3 bucket via http. Example of the desired nginx configuration:
vod_upstream_location /s3;
location /s3/ {
internal;
proxy_pass http://my-s3-bucket.s3-eu-east-1.amazonaws.com/;
}
I tried to create Access Point to my s3. In the settings I had pointed Access option to my VPC, but cURL returned 403 from EC2 when I tried to get some object from s3 by http url.
Also I had created IAM role with read-only S3 access and assign to my EC2, but result was same - 403.
How to set up private http-access from EC2 to s3 bucket via virtual private amazon network in same region?
This does not work because you can't access objects based on their URL, unless they are public. Since you've assigned IAM role to the EC2 instance you have to make signed http request to the object using the object's url with EC2 instance role credentials.
So either have to construct the valid signature yourself, or simply use AWS SDK, such as boto3 for python, to do this for you. By looking at the kaltura-nginx-vod description it does not seem to be making any signed requests to S3 on your behalf.

how to download file from public s3 bucket using console

I want to download the file from a public S3 bucket using AWS console. When I put the below in the browser but getting an error. Wanted to visually see what else is there in that folder and explore
Public S3 bucket :
s3://us-east-1.elasticmapreduce.samples/flightdata/input
It appears that you are wanting to access an Amazon S3 bucket that belongs to a different AWS account. This cannot be done via the Amazon S3 management console.
Instead, I recommend using the AWS Command-Line Interface (CLI). You can use:
aws s3 ls s3://flightdata/input/
That will show you the objects stored in that bucket/path.
You could then download the objects with:
aws s3 sync s3://flightdata/input/ input

When S3 bucket policy is set in AWS website, should I do it again in my Javacode that will be running in an Ec2 instance?

I have set S3 bucket policy in my S3 account via web browser
https://i.stack.imgur.com/sppyr.png
My issue is, the java code of my web app when run in my local laptop, it uploads image to S3.
final AmazonS3 s3 = new AmazonS3Client(
new AWSStaticCredentialsProvider(new BasicAWSCredentials("accessKey*",
"secretKey")));
s3.setRegion(Region.US_West.toAWSRegion());
s3.setEndpoint("s3-us-west-1.amazonaws.com");
versionId = s3.putObject(new PutObjectRequest("bucketName", name, convFile)).getVersionId();
But when I deploy my web app to Elastic Beanstalk, it doesn't successfully upload images to S3 object.
So Should I programmatically code S3 bucket policy again in my Java Code?
PS: Additional details that may be useful : Why am I able to upload to AWS S3 from my localhost, but not from my AWS Elastic BeanStalk instance?
Your S3 bucket policy is too permissive. You should delete it asap.
Instead of explicitly supply credentials to your Elastic Beanstalk app in code, you should create an IAM role that the Elastic Beanstalk app will assume. That IAM role should have an attached IAM policy that allows appropriate access to your S3 bucket, and to the objects in the bucket.
When testing on your laptop, your app does not need to have credentials in the code. Instead, your app should leverage the fact that the AWS SDK will retrieve credentials for you from the environment that the app is running in. You should use the default credential provider chain.

Trouble integrating EMR with S3

I am having trouble integrating EMR with S3 i.e to implement EMRFS
EMR Version: emr-5.4.0
When I run hdfs dfs -ls s3://pathto/bucket/ I get following error
ls: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXX),
S3 Extended Request ID: XXXXX**
Please guide what is that, what I am missing ?
I have done following steps
Created a KMS Key for EMR
Added EMR_EC2_DefaultRole as key users in newly creates KMS Key
Created a S3 Server Side Encryption Security Config policy for EMR
Created new Inline policy for role/EMR_EC2_DefaultRole and EMR_DefaultRole for S3 bucket access
Created a EMR cluster manually with new EMR Security policy and following configuration classification
"fs.s3.enableServerSideEncryption": "true",
"fs.s3.serverSideEncryption.kms.keyId":"KEYID"
EMR, by default, will use instance profile credentials(EMR_EC2_DefaultRole) to access your S3 bucket. The error means this role does not have necessary permissions to access S3 bucket.
You will need to verify the IAM Role policy of that role to allow necessary S3 actions on both bucket and objects (Like s3:list*). Also check if you have any explicit Deny's etc.
http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html
The access could also be denied because of a Bucket policy on set on the S3 bucket you are trying to access.
http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html
https://aws.amazon.com/blogs/security/iam-policies-and-bucket-policies-and-acls-oh-my-controlling-access-to-s3-resources/
Your EMR cluster could be using an VPC endpoint for S3 to access S3 rather than Internet/NAT. In that case, you'll also need to verify VPC endpoint policies as well.
https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html#vpc-endpoints-policies-s3