Prabhakar Shanmugam
Prabhakar Shanmugam

Reputation: 6154

How to generate url from boto3 in amazon web services

I have a Bucket in s3 and I am trying to pull the url of the image that is in there.

I am using boto3 and boto3 doesn't seem to have an implemented generate url method.

They have a core method, that generates url like this,

import botocore.session

session = botocore.session.get_session()
client = session.create_client('s3')

presigned_url = client.generate_presigned_url(
    'get_object', Params={'Bucket': self.bucket_name, 'Key': self.key})

One thing I am forced to do is, I have to send the parameters along with each request using session object. And the above method does not allow me to set the session variables (ie .. aws credentials)

The closest I can get is this

session = Session(aws_access_key_id='342342342342', aws_secret_access_key='3434234322', region_name='us-east-1')
    s3 = session.resource('s3')
    object = s3.Object('my-dev-bucket', 'amazonKeyString')
    print object.get()["Body"]

This gets me amazon s3 object which is an object called

botocore.response.StreamingBody object at 0x7ffaff8cef50

Can I get a url of the image this way?

Upvotes: 36

Views: 63145

Answers (2)

kmchmk
kmchmk

Reputation: 642

If you don't want to use aws configure command, you can pass the credentials directly like this and generate the public URL.

def generate_public_url(bucket_name, file_name, aws_region, aws_key_id, aws_secret, timeout=300):
    #if not object_exists(bucket_name, file_name):
    #    raise Exception(f"0 or many items found in bucket '{bucket_name}' with key '{file_name}')")
    s3_client = boto3.client('s3', config=Config(signature_version='s3v4'),
                             region_name=aws_region, aws_access_key_id=aws_key_id, aws_secret_access_key=aws_secret)
    url = s3_client.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': bucket_name,
            'Key': file_name
        },
        ExpiresIn=timeout  # seconds
    )
    return url

Upvotes: 3

omuthu
omuthu

Reputation: 6343

Able to get results and did not face any issues in getting the signed URL. I used the default session since my aws creds were stored locally in "~/.aws/credentials" file and my default region is set as needed ~/.aws/config

import boto3
s3Client = boto3.client('s3')
s3Client.generate_presigned_url('get_object', Params = {'Bucket': 'www.mybucket.com', 'Key': 'hello.txt'}, ExpiresIn = 100)

If you need to pass params for Session, import boto3.session and create custom session

import boto3.session
session = boto3.session.Session(region_name='eu-central-1')
s3Client = session.client('s3')

Upvotes: 82

Related Questions