前回の続き〜!!!
AWSサービス連携① 〜Lambda/python〜
業務でAWS/Lambdaを用いてのサーバレス構成を構築する機会があったので、実装方法などを備忘録がてら残しておくことにした。開発言語はpythonでboto3を使用。この記事ではDynamoDBについて、使用方法や注意点をまとめている。
RDS
基本的にはAWSでもDBとの接続は同じである。psycopg2ライブラリを用いて接続し、データを取得する。クエリを変えればレコードの更新・削除等できる。
# DBの情報を入力
connector = psycopg2.connect(
host='XXXXXX',
port='XXXXXX',
database='XXXXXX',
user='XXXXXX',
password='XXXXXX',
)
sql = "SELECT * FROM table_name WHERE id = 10"
cur = connector.cursor()
cur.execute(sql)
result = cur.fetchall(cursor_factory=psycopg2.extras.DictCursor)
connector.commit()
cur.close()
connector.close()
S3
データを書き込む
書き込むデータの種類によって異なる。複数パターンがある場合はtypeによる分岐処理が必要。BucketはS3のバケットでKeyはバケット以降のパスという認識。Keyはファイル名も含む。
- csvの場合
s3 = boto3.client('s3')
buf = io.BytesIO()
data.to_csv(buf, index=False, encoding='utf-8')
s3.put_object(Bucket=XXXXXX, Key=XXXXXX, Body=buf.getvalue())
- jsonの場合
s3 = boto3.resource('s3')
buc = s3.Bucket(XXXXXX) # Bucket名
obj = buc.Object(XXXXXX) # Key名
response = obj.put(Body=data)
- pickleの場合
s3 = boto3.resource('s3')
buf = io.BytesIO()
pickle.dump(data, buf)
s3.Bucket(XXXXXX).put_object(Key=XXXXXX, Body=buf.getvalue())
データを読み込む
読み込みもデータの種類によって異なる。
- csvの場合
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=XXXXXX, Key=XXXXXX)
data = io.BytesIO(obj['Body'].read())
data.seek(0)
df = pd.read_csv(data, encoding='utf-8')
この時のファイルが存在しなかった例外は
except s3.exceptions.NoSuchKey as e:
で拾うことができる。ある場合とない場合の判定に使用できる。
- pickleの場合
s3 = boto3.resource('s3')
pkl = pickle.loads(s3.Bucket(XXXXXX).Object(XXXXXX).get()['Body'].read())
この時のファイルが存在しなかった例外は
except s3.meta.client.exceptions.NoSuchKey as e:
で拾うことができる。
SNS
このサービスは登録したアドレスにメールを送ることができるものである。今回はエラーが発生した時のメール通知用途に使用した。
sns = boto3.client('sns')
response = sns.publish(
TopicArn=XXXXXX, # SNSで設定したArn
Message='エラーが起きました!!!',
Subject='SNS message'
)
Lambda
lambdaから別のlambdaを実行する方法は下記。
boto3.client('lambda').invoke(
FunctionName='実行するlambdaの名',
InvocationType='Event',
Payload=data # 渡すデータ
)
InvocationTypeは2種類指定できる。
‘RequestResponse’: 同期(呼び出し先lambdaの結果を待つ)
‘Event’: 非同期(呼び出し先lambdaの結果を待たない)
APIの実行
これはAWSに限った話ではないが、1つのAPIの叩き方として備忘録として残しておく。
req = urllib.request.Request(URL, data=data, header=header)
with urllib.request.urlopen(req) as res:
body = json.loads(res.read())
まとめ
この辺が触れればある程度なんでも作れてしまうような気がするけど、どうなんだろうか。。。pickleはあんまり使う機会ないかなと思いつつ、AIの時代だからという理由だけで残しました。AWSは料金が高くて個人開発では使う機会があまりない気がするので、今回触れてラッキーだった。いろんなサービスと連携できると楽しいネ!!!
コメント