amplifyでのLambdaの使い方について要点をまとめました。
bookの新規登録を例に説明しています。
functionの追加
amplifyでLambdaを使用するには、まずはfunctionを作成する必要があります。
以下コマンドを実行して追加します。
$ amplify add function
ここではbookという名前でAWS Lambda functionを作成します。
(node:4179) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
(Use `node --trace-warnings ...` to show where the warning was created)
? Select which capability you want to add: Lambda function (serverless function)
? Provide an AWS Lambda function name: book
? Choose the runtime that you want to use: Python
Only one template found - using Hello World by default.
functionをupdateして、CRUDの権限を設定します。
$ amplify update function
? Which setting do you want to update? Resource access permissions
? Select the categories you want this function to have access to. storage
? Storage has 7 resources in this project. Select the one you would like your Lambda to access Book:@model(appsync)
? Select the operations you want to permit on Book:@model(appsync) create, read, update, delete
これでbook functionにCRUDの権限設定をすることができました。
functionを作成すると、以下ディレクトリにファイル等が生成されます。
プロジェクト/ amplify/ backend/ function/ book
Lambdaファイル編集
以上のようにfunctionを作成すると、最初、pythonファイルには以下のように記述されています。
import json
def handler(event, context):
print('received event:')
print(event)
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': '*',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
},
'body': json.dumps('Hello from your new Amplify Python lambda!')
}
これを書き換えて、bookの登録ができるようにしていきます。
eventの中にはjson形式で大量のデータが入っています。
このデータを利用して、addBook関数を作ります。
def addBook():
'ここにDynamoDBに登録するコードを記述する'
addBook関数の中身の詳細の説明は省略します。
このLambdaとフロントエンドを紐付ける必要があります。
このお作法が難しいですよね!
schemaの定義
schema.graphqlに以下のように記述します。
addBook(book: String): String @function(name: "book-${env}")
これは、上記でLambdaのpythonファイルで作成したaddBook関数を指しており、
@functionの部分で、どのfunctionから呼び出すかということを記述しています。
そして、amplify pushをします。
$ amplify push
これにより、API.tsとmutation.tsに以下が作成されます。
export type AddBookMutationVariables = {
book?: string | null,
};
export type AddBookMutation = {
addBook?: {
__typename: "bookResponse",
status_code?: string | null,
detail?: string | null,
} | null,
};
export const addBook = /* GraphQL */ `
mutation AddBook($book: String) {
addBook(book: $book) {
status_code
detail
}
}
`;
これら作成されたものをフロントエンドで使っていきます。
import { AddBookMutationVariables } from '@/API';
import { addBook } from '@/graphql/mutation'
const [book, setBook] = useState('')
let params: AddBookMutationVariables = {
book: book,
};
let result = ((await API.graphql(graphqlOperation(addBook, params))) as any).data.addBook;
if (result.status_code === '200') {
alert('本の登録ができました。');
} else {
alert(`本の登録に失敗しました。\r\n${result.detail}`);
}
これで、フロントエンドからLambdaにアクセスすることができ、pythonで記述した関数内にDynamoDBに登録するよう指定していれば、そのように登録ができるようになります。
以上、amplifyでのLamdaのお作法についてでした。お読みいただきありがとうございました。
コメント