【Amplify】Lambdaの使い方

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のお作法についてでした。お読みいただきありがとうございました。

コメント