【AWS】CognitoでSignUpしたユーザの情報をDynamoDBに追加する方法


現在iOSアプリを開発しており、Cognitoを使ったログイン機能は実装できたのですが、登録したユーザ名などの情報をアプリ上でも使いたかったのでその方法をまとめておきます。

ざっくりと以下のような流れになります。

0. Cognitoでユーザプールを作成する
1. DynamoDBにデータを追加するテーブルを作成する
2. Lambda関数を作成する
3. Cognitoで確認後トリガーにLambda関数を設定する

0. Cognitoでユーザプールを作成する

すでにユーザプールが作成されていることを想定しているため、省略します。
(ユーザプール名はsample-userpoolとしました。)
Lambda関数を作成後、トリガーの設定をするために戻ってきます。

1. DynamoDBにデータを追加するテーブルを作成する

下記のように、テーブル名をsample-table、プライマリーキーをusernameとし、テーブルを作成します。
今回はusernameだけを使いたいので、そのほかの属性は省略します。

2. Lambda関数を作成する

下記のように、関数名をsample-lambda、ランタイムをPython3.8とします。

アクセス権限のロールは、AWSポリシーテンプレートから新しいロールを作成にして、シンプルなマイクロサービスのアクセス権限テストハーネスのアクセス権限を選びます。

次に、LambdaではPythonの外部モジュールをzipで読み込む必要があるため、zipファイルを作ります。
今回はboto3というAWSが提供しているライブラリを使用するため、下記コマンドでインストールします。

$ pip install boto3 -t ./sample-modules

すると、sample-modulesが作成され、その中にいくつかのディレクトリとファイルが追加されていると思います。
できていたら、今作成したsample-modules内に、lambda_function.pyを作成します。

$ cd sample-modules
$ vi lambda_function.py

Cognitoからユーザ情報(username)を受け取り、DynamoDBに追加するためのPythonのプログラムをlambda_function.pyに書き、保存します。

lambda_function.py
import boto3

def lambda_handler(event, context):

    dynamoDB = boto3.resource("dynamodb")
    # DynamoDBのテーブル名
    table = dynamoDB.Table("sample-table")

    # DynamoDBへデータを追加する
    table.put_item(
      Item = {
        "username": event['userName']
      }
    )

    return event

そして、sample-modules配下のファイルのパーミッションを755にします。

$ chmod -R 755 ./sample-modules/

最後に、現在のsample-modulesを圧縮し、upload.zipにします。

$ zip -r upload.zip *

これができたら、先ほど作成したLambda関数にzipファイルをアップロードしましょう。

念のため、テストタブで下記のSignUpEventを実行して見てください。
DynamoDBのsample-tableにtestNameが追加されていたら成功です!

{
  "triggerSource": "testTrigger",
  "userPoolId": "testPool",
  "userName": "testName",
  "callerContext": {
      "clientId": "12345"
  },
  "response": {}
}

3. CognitoのトリガーにLambda関数を設定する

最後に、ユーザがSignUpを完了したタイミングで作成したLambda関数を呼び出すために、Cognitoのトリガーを設定します。
Cognitoでユーザプールを開き、左のメニューのトリガーを選択します。
すると、サインアップ前や認証前などが出てくると思うので、確認後のトリガーsample-lambdaを選んでください。

これで全工程が完了です!!いかがでしたでしょうか。
私は今回Lambdaを初めて使ったのでかなり時間がかかりました・・なので備忘録としてここに残しておきます。

参考にしたサイト