こんにちは、広野です。
以前、以下の記事で 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 が必要となるケースが多いと思います。
本記事が皆様のお役に立てれば幸いです。