見出し画像

【AWS Glue】Python Shellで環境変数にプロキシを設定したらboto3使用時NoCredentialsErrorが発生


やりたかったこと

  • Glue Python Shellから外部APIをコールしてレスポンスをS3にファイル出力する

  • プロキシを超える必要がある

エラー発生時のコード

  • os.environ()を使ってプロキシの設定をしました

  • 結果は『NoCredentialsError: Unable to locate credentials』

    • botocore.exceptions.NoCredentialsError: Unable to locate credentials

import urllib.request
import os
import boto3

ENCODING='utf-8'
OUTPUT_BUCKET_NAME='s3-output-bucket'
OUTPUT_FILE_PATH='response.json'

os.environ['http_proxy'] = 'http://{USERNAME}:{PASSWORD}@{PROXY_HOST}:{PROXY_PORT}'
os.environ['https_proxy'] = 'https://{USERNAME}:{PASSWORD}@{PROXY_HOST}:{PROXY_PORT}'

url = 'https://xxxx'
req = urllib.request.Request(url)

with urllib.request.urlopen(req) as res:
   body = res.read().decode(ENCODING)
   print(body)

s3 = boto3.resource('s3')
output_object = s3.Object(OUTPUT_BUCKET_NAME, OUTPUT_FILE_PATH)
output_object.put(Body = body)

対応後のコード

  • os.environ()でプロキシの設定を行わなければboto3を使ってもエラーが起こらないことは確認できていたので、APIの処理が終わったらdelを使って環境設定を削除することで対応しました

import urllib.request
import os
import boto3

ENCODING='utf-8'
OUTPUT_BUCKET_NAME='s3-output-bucket'
OUTPUT_FILE_PATH='response.json'

os.environ['http_proxy'] = 'http://{USERNAME}:{PASSWORD}@{PROXY_HOST}:{PROXY_PORT}'
os.environ['https_proxy'] = 'https://{USERNAME}:{PASSWORD}@{PROXY_HOST}:{PROXY_PORT}'

url = 'https://xxxx'
req = urllib.request.Request(url)

with urllib.request.urlopen(req) as res:
   body = res.read().decode(ENCODING)
   print(body)

del os.environ['http_proxy']
del os.environ['https_proxy']

s3 = boto3.resource('s3')
output_object = s3.Object(OUTPUT_BUCKET_NAME, OUTPUT_FILE_PATH)
output_object.put(Body = body)


この記事が気に入ったらサポートをしてみませんか?