現在iOSアプリを開発しており、Cognitoを使ったログイン機能は実装できたのですが、登録したユーザ名などの情報をアプリ上でも使いたかったのでその方法をまとめておきます。
ざっくりと以下のような流れになります。
**0. Cognitoでユーザプールを作成する
- DynamoDBにデータを追加するテーブルを作成する
- Lambda関数を作成する
- 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に書き、保存します。
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を初めて使ったのでかなり時間がかかりました・・なので備忘録としてここに残しておきます。