web-dev-qa-db-ja.com

Boto3構成ファイルを使用してS3エンドポイントを上書きする

概要:

構成ファイル(boto3)を使用して、~/aws/confgの特定の変数を上書きしようとしています。ユースケースでは、fakes3サービスを使用して、S3リクエストをローカルホストに送信します。

例:

botoboto3ではない)で、~/.botoに次のような構成を作成できます。

[s3]
Host = localhost
calling_format = boto.s3.connection.OrdinaryCallingFormat

[Boto]
is_secure = False

また、クライアントは目的の変更を正常に取得でき、トラフィックを実際のS3サービスに送信する代わりに、ローカルホストに送信します。

>>> import boto
>>> boto.connect_s3()
S3Connection:localhost
>>> 

私が試したもの:

boto3ライブラリを使用して同様の結果を達成しようとしています。ソースコードを見ると、~/aws/configの場所を使用できることがわかりました。 unittestsbotocoreフォルダーにも設定例があります。

希望する動作を実現するために設定を変更しようとしました。しかし、残念ながら機能しません。

設定は次のとおりです。

[default]
aws_access_key_id = XXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYY
region = us-east-1
is_secure = False
s3 =
    Host = localhost

質問:

  1. 構成ファイルを使用してclients変数を上書きする方法は?
  2. 構成に許可されている変数の完全なリストはどこにありますか?
26
Vor

ホストを設定ファイルに設定することはできませんが、boto3を使用してコードからホストを上書きすることができます。

import boto3

session = boto3.session.Session()

s3_client = session.client(
    service_name='s3',
    aws_access_key_id='aaa',
    aws_secret_access_key='bbb',
    endpoint_url='http://localhost',
)

その後、通常どおり対話できます。

print(s3_client.list_buckets())
37
ChillarAnand

boto3は、その構成ファイルからs3の署名バージョンのみを読み取ります。機能リクエストを開くこともできますが、ここではカスタムエンドポイントに対処する方法を示します。

import boto3
from botocore.utils import fix_s3_Host
resource = boto3.resource(service_name='s3', endpoint_url='http://localhost')
resource.meta.client.meta.events.unregister('before-sign.s3', fix_s3_Host)

boto3が適合を検出すると自動的にエンドポイントをyour_bucket_name.s3.amazonaws.comに変更するため、メタに関するそのビットは重要です 1 。独自のホストとs3の両方を使用する場合は、機能を完全に削除するのではなく、機能をオーバーライドすることができます。

4
Jordon Phillips

別の方法:

import boto3

s3client = boto3.client('s3', endpoint_url='http://X.X.x.X:8080/',
        aws_access_key_id = 'XXXXXXX',
        aws_secret_access_key = 'XXXXXXXX')
bucket_name = 'aaaaa'
s3client.create_bucket(Bucket=bucket_name)
2
okwap

boto3リソースを使用:

import boto3

# use third party object storage
s3 = boto3.resource('s3', endpoint_url='https://URL:443',
  aws_access_key_id = 'AccessKey',
  aws_secret_access_key = 'SecertKey')

# Print out bucket names
for bucket in s3.buckets.all():
 print(bucket.name)
0
Andi-OTC