ablog

不器用で落着きのない技術者のメモ

Python Shell から Secrets Manager へのアクセスで "Connection to secretsmanager ... timed out" と怒られる

事象

  • Glue の Python Shell から Secrets Manager からパスワードなどを取得して Redshift にクエリを発行するジョブを実行するエラーになり、CloudWtach Logs を確認すると以下のメッセージが出力されている。
urllib3.exceptions.ConnectTimeoutError: (<botocore.awsrequest.AWSHTTPSConnection object at 0x7fb31ea5e128>, 'Connection to secretsmanager.us-east-1.amazonaws.com timed out. (connect timeout=60)')

(中略)

botocore.exceptions.ConnectTimeoutError: Connect timeout on endpoint URL: "https://secretsmanager.us-east-1.amazonaws.com/"

解決策

  • Secrets Manager の VPCエンドポイントを作成する。
  • VPCエンドポイントの Security Groupで Python Shell のジョブの Security Group からのアクセスを許可する。

コード

from redshift_module import pygresql_redshift_common as rs_common
import sys
from awsglue.utils import getResolvedOptions
import boto3

#get job args
args = getResolvedOptions(sys.argv,['db','db_creds','bucket','file'])
db = args['db']
db_creds = args['db_creds']
bucket = args['bucket']
file = args['file']

#get sql statements
s3 = boto3.client('s3') 
sqls = s3.get_object(Bucket=bucket, Key=file)['Body'].read().decode('utf-8')
sqls = sqls.split(';')

#get database connection
print('connecting...')
con = rs_common.get_connection(db,db_creds)

#run each sql statement
print("connected...running query...")
results = []
for sql in sqls[:-1]:
    sql = sql + ';'
    result = rs_common.query(con, sql)
    print(result)
    results.append(result)

print(results)