やりたいこと
- cognitoで登録が終わった後にUserに対応するディレクトリを特定のS3に作成したい
方法
cognito側の準備
cognitoでuser poolを作りたいように作成します。
ほかの方の解説も多いので割愛します。
今回は、諸々の設定が面倒臭いのでHostedUIを利用します。
特に自作の画面でも問題ないですが、自作の画面はうまく認証を通すのが難しいので今回はこれで、、、
HostedUIの設定方法です。
作成したUserPool
>アプリケーションの統合
タブ>アプリクライアントと分析 (1)
ここに、UserPoolを作成したときに作成したはずのアプリケーションがあります。
そこをクリックした画面を下がると、以下のようなものがあるはずです。
何も設定されていない場合は、適宜設定してください。
また、好きなドメインも設定しておきましょう。お試しであればcognito ドメインを利用すれば問題ないはずです。
S3の準備
全部デフォルトでまずは作成します。
以上
Lambdaの準備
import { S3 } from '@aws-sdk/client-s3';
const s3 = new S3();
const CONTENT_BUCKET = process.env.CONTENT_BUCKET || 'test';
export const handler = async (event, context) => {
try {
await s3.putObject({
Bucket: CONTENT_BUCKET,
Key: `debug-logs/cognito-events/${Date.now()}.json`,
Body: JSON.stringify(event, null, 2),
ContentType: 'application/json'
});
console.log('Event logged successfully');
return event;
} catch (error) {
console.error('Error:', error);
return event;
}
};
簡単にS3にデータを保存するだけのLambdaです。
とりあえず今はeventのものを全部入れて日付をファイル名にしています。
cognitoで生成されるユーザー名はuserNameに入っているので、実際のディレクトリ名などはそこからとる感じです。
Lambdaのアクセス権の設定
作ったlambda
>設定
>アクセス権限
>実行ロール
で実行しているロールをクリックできるのでロールに飛びましょう
そうするとロールがあるのですが、現状はS3に書き込む権限などが足りません。
許可を追加
>インラインポリシーを作成
をクリックして、ポリシーエディタに行きます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::XXXXXXXXXXXXXXXXXXXXXXXX/*"
]
}
]
}
とりあえずは、こちらで大丈夫ですが必要に応じて権限を絞るようにしてください。
取得など必要なかったら消してしまってください。
ここまで設定できればほとんど終了です。
元からLambdaでS3を操作したことがある人であれば見る必要もない部分でしたね、、、
Cognitoのサインアップで発火するようにする
cognitoのユーザープールのプロパティまで行くと、Lambdaトリガーがあるのでそれを利用します。
今回は、サインアップ後のトリガーを利用することで、サインアップが成功したタイミングでLambdaが発火するように設定できます。
もし複数のLambdaが発火する必要がある場合は、cognitoでは設定できないようなので工夫が必要そうです。
先ほど作成した関数を選択して保存すると設定は終了です。
試してみる。
ここまで行くと簡単にサインアップ画面に行くことができるので、サインアップを試してみましょう。
ホストされたUIを表示して、必要な情報を入力することでLambdaの発火が確認できるはずです。
うまくいかない場合は、クラウドウォッチなどを用いて確認してみてください。
まとめ
100忘れる予感がしたので作成したが、誰かの助けになれば幸いです。