こんにちは、広野です。
以前、以下の記事で AWS AppSync に Mutation をかける AWS Lambda 関数コードを以下の記事内で紹介していたのですが、Node.js で書いたものでした。先日 Node.js 16 が EoL になったことを受けて、AWS Lambda 関数を Python 3.12 で書き換えたので書き残しておきます。
AWS Lambda 関数コード
前置きなしでいきなりコード紹介に入ります。
mutation で渡す値は架空のものです。
import boto3
import json
import requests
from requests_aws_sign import AWSV4Sign
session = boto3.session.Session()
credentials = session.get_credentials()
auth = AWSV4Sign(credentials, 'ap-northeast-1', 'appsync') #AppSyncがデプロイされているリージョンを指定
def lambda_handler(event, context):
try:
endpoint = 'AppSyncEndpointUrl' #AppSyncのURLを指定
headers = {'Content-Type': 'application/json'}
query = """
mutation updateJobstatus(
$serviceiduser: String!,
$datetime: String!,
$url1: String,
$url2: String,
$status: String
) {
updateJobstatus(input: {
serviceiduser: $serviceiduser,
datetime: $datetime,
url1: $url1,
url2: $url2,
status: $status
}) {
serviceiduser
}
}
"""
variables = {
'serviceiduser': 'xxxxxxxx',
'datetime': 'xxxxxxxx',
'url1': 'xxxxxxxx',
'url2': 'xxxxxxxx',
'status': 'xxxxxxxx'
}
payload = {'query': query, 'variables': variables}
result = requests.post(endpoint, auth=auth, json=payload, headers=headers).json()
if 'errors' in result:
print(result['errors'])
except Exception as error:
print(error)
result = {'errors': [{'message': str(error)}]}
AWS AppSync は受けた Mutation を実行してよいのかどうか、実行元 (AWS Lambda 関数) から送られてきた IAM 情報と照合します。そのため、送信時に Signature V4 という仕組みを使用して情報を署名化し、リクエストのヘッダーに入れる処理が必要になります。
以下、前提事項です。
- AWS Lambda 関数に、appsync:GraphQL を実行できる IAM ロールを関連付けていること。
- AWS AppSync のスキーマ設定で、該当する Mutation の設定に IAM でアクセス可能な記述をしていること。
- import している requests モジュールはどノーマルの AWS Lambda 関数では import できないので、requests の Lambda レイヤーを作成しておくこと。requests をインストールして、同時にインストールされたモジュールとセットで ZIP で固めます。
Lambda レイヤーの作成方法は以下の記事を参考にしてください。
AWS Lambda (Python 3.12) で使用可能な pandas の Lambda Layer を準備するデータ分析や加工でよく使われるライブラリに、pandas があると思います。本記事では、AWS Lambda (Python 3.12) で動作する pandas の Lambda Layer を準備する手順を紹介します。
詳細な AWS AppSync 関連設定情報は、繰り返しになりますが以下の参考記事をご覧下さい。
まとめ
いかがでしたでしょうか。
AWS AppSync を使用しているアプリでアプリ外から画面更新させたいときには AWS Lambda 関数からの Mutation が必要となるケースが多いと思います。
本記事が皆様のお役に立てれば幸いです。