AWS boto3でSSOを突破したい!
みなさん、こんにちは!
AWS s3に置いている大量のJSONファイルをローカル上にダウンロードする必要が出てきたのですが、、、
s3ってコンソールでダウンロードするのは、かなーーーーりめんどくさい。ですよね。。。
コンソール上でチェックボタンを入れて、複数選択した状態ではダウンロードできない。(これ結構不便)
CLIでやるのも一手間。。。(CLIの引数めんどくさい、)
であれば、もういっそのことひとつPythonで書いちゃいえ!
ということで、今回はサクッと書いてみました笑
みなさんの参考になれば幸いです。(参考にならなくても広めてほしいです笑)
今回のポイント
・まずはターミナル上で、aws sso login --profile xxxx でSSOログインします。
・その後、Pythonの中で利用するSSO Profile名をboto3.sessionで使います。
・そして、SSOログインしたものを使ってs3にアクセスする。
これだけです!
コードはこちら
import boto3
my_session = boto3.Session(profile_name='<SSOログイン名>')
s3 = my_session.client('s3')
BUCKET = "<s3 bucket name>"
param={
"Fukuoka":"Fukuoka.json",
"Tokyo":"Tokyo.json",
"Osaka":"Osaka.json",
"Chiba":"Chiba.json",
"Shiga":"Shiga.json",
"Saga":"Saga.json"
}
for k,v in param.items():
if k.find("/"):
location = k
s3_okiba = "pref/"+v
out_okiba = "/Users/hoge/Desktop/"+v
s3.download_file(BUCKET,s3_okiba,out_okiba)
ssoログイン
SSOログインのところは、ここです。
my_session = boto3.Session(profile_name='<SSOログイン名>')
defaultを使っている人は、defaultでOKです。
複数使っている場合は、それぞれにあったSSOログイン名を入れてあげましょう!
s3へのアクセス
s3 = my_session.client('s3')
BUCKET = "<s3 bucket name>"
s3へのアクセスは、先ほどのssoログインのところで使ったmy_sessionを使う必要があるので、普段だと、boto3.client('s3')と書いているところですが、
ここでは、my_session.client('s3')としています。
あとはBUCKETのところに取得したいS3バケット名を記述しましょう。
あとはそのままいつも通り。
私の場合は、パラメータを渡して回帰的に取得したいと思っていたので、
このような書き方にしています。
これでぐるぐるしながらデータ取得ができると思います。
この中を書き換えれば、他にもどんどんデータ取得できちゃいますね!
まあでも、これができれば、AWS CLIを使ってやるのもありですね。
他にもこんなことができるかも。
boto3でSSOを突破すると、他にもなんでもできます。(boto3でできることが)
例えば。
import boto3
my_session = boto3.Session(profile_name='<profile>')
s3 = my_session.resource('s3')
bucket_name = "<backet_name>"
prefix = "<探したいパスを入れる>"
# バケット内のファイル一覧を取得
objects = s3.Bucket(bucket_name).objects.filter(Prefix=prefix)
if not list(objects):
print("指定したプレフィックス内にファイルは存在しません。")
else:
print("指定したプレフィックス内のファイル一覧:")
for obj in objects:
print(f'ファイル名: {obj.key}, サイズ: {obj.size} バイト')
こちらを実行することで、prefixに入れたディレクトリの下でlsをしてくれルような感じにもできます〜!
この記事が気に入ったらサポートをしてみませんか?