简体   繁体   中英

I can use CyberDuck to connect to S3 Bucket, but I cannot programmatically connect

I am attempting to connect to an S3 bucket (A 3rd party is the owner, so I cannot access through AWS console). Using CyberDuck, I can connect and upload files no problem. However I have tried several libraries to connect to the bucket all of which return a 403 forbidden. I am posting here in hopes that someone can spot what I am doing incorrectly.

    def send_to_s3(file_name):
        csv = open("/tmp/" + file_name, 'rb')
        conn = tinys3.Connection("SECRET",
                                 "SECRET",
                                 tls=True,
                                 endpoint="s3.amazonaws.com")
        conn.upload("MDA-Data-Ingest/input/" + file_name, csv, bucket="gsext-69qlakrroehhgr0f47bhffnwct")


    def send_via_ftp(file_name):
        cnopts = pysftp.CnOpts()
        cnopts.hostkeys = None
        srv = pysftp.Connection(host="gsext-69qlakrroehhgr0f47bhffnwct.s3.amazonaws.com",
                                username="SECRET",
                                password="SECRET",
                                port=443,
                                cnopts=cnopts)

        with srv.cd('\MDA-Data-Ingest\input'):
            srv.put('\\tmp\\'+file_name)

        # Closes the connection
        srv.close()

    def send_via_boto(file_name):
        access_key = 'SECRET'
        secret_key = 'SECRET'

        conn = boto.connect_s3(
            aws_access_key_id=access_key,
            aws_secret_access_key=secret_key,
            host='s3.amazonaws.com',
            # is_secure=False,               # uncomment if you are not using ssl
            calling_format=boto.s3.connection.OrdinaryCallingFormat(),
        )

All of these functions return a 403 forbidden as shown bellow:

HTTPError: 403 Client Error: Forbidden for url: https://gsext-69qlakrroehhgr0f47bhffnwct.s3.amazonaws.com/MDA-Data-Ingest/input/accounts.csv

However when I use CyberDuck I can connect just fine:

在此处输入图片说明

The easiest method would be to use the AWS Command-Line Interface (CLI) , which uses boto3 to access AWS services.

For example:

aws s3 ls s3://bucket-name --region us-west-2

aws s3 cp s3://gsext-69qlakrroehhgr0f47bhffnwct/MDA-Data-Ingest/input/accounts.csv accounts.csv

You would first run aws configure to provide your credentials and a default region, but the syntax above allows you to specify the particular region that the bucket is located. (It is possible that your Python code failed due to calling the wrong region.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM