[アップデート] Amazon Cognito ユーザープールの Lambda トリガーで新しいトリガータイプ「フェデレーション」が追加されました
いわさです。
Amazon Cognito のユーザープールには認証/認可イベントの処理に Lambda 関数を挟むことで様々なカスタマイズを行うことが出来る Lambda トリガーという機能があります。
色々な Lambda トリガータイプが用意されているのですが、先日のアップデートで新しいトリガータイプ「フェデレーション」が追加されました。
いくつかユースケースがあるあのですが、ユーザープール属性サイズの最大文字数は 2048 文字なのですが、IdP から属性連携される際にそれを超える場合はアプリケーションサインイン時にエラーとなります。
例えば今回のアップデートの Lambda トリガーを使って、連携される属性の編集を行うことでそれらに対処することなども出来ます。
属性の編集だけでなく、追加や抑制も出来ます。
以下の公式ドキュメントでいくつかユースケース例の記載があります。例えばグループメンバーシップのマッピングに使ったり、フェデレーションイベントのログを記録したりしています。
適当な関数を使い、SAML 連携したユーザープールで動作確認してみましたので紹介します。
使ってみる
公式ドキュメントに明記されていないですが、今回の Lambda トリガーは Cognito プランによる制限は特に無さそうで、ライトプランでも利用することが出来ました。
次のように拡張機能メニューから新しい Lambda トリガーを追加します。

追加したものが以下です。「インバウンドフェデレーション Lambda トリガー」というものが追加されました。

なお、設定できる関数は一つまでとなっており、フェデレーションタイプのトリガーを既に追加している場合は次のように選択が出来ません。

アップデートとあまり関係ないので詳細手順は割愛しますが、今回は Cognito ユーザープールの外部プロバイダーにとして IAM Identity Center のカスタムアプリケーションを SAML 連携させました。


IAM Identity Center からのログインテストを行ってみると Lambda トリガーで指定した Lambda 関数が実行されていることが確認出来ました。

関数の内容はほぼ公式ドキュメントから流用したものです。
export const handler = async (event) => {
const { providerName, providerType, attributes } = event.request;
// Extract user attributes based on provider type
let userAttributesFromIdp = {};
if (providerType === 'SAML') {
userAttributesFromIdp = attributes.samlResponse || {};
} else {
// For OIDC and Social providers, merge userInfo and idToken
userAttributesFromIdp = {
...(attributes.userInfo || {}),
...(attributes.idToken || {})
};
}
// Log federated authentication details
console.log(JSON.stringify({
timestamp: new Date().toISOString(),
providerName,
providerType,
userEmail: userAttributesFromIdp.email,
attributeCount: Object.keys(userAttributesFromIdp).length,
attributes: userAttributesFromIdp
}));
// Pass through all attributes unchanged
event.response.userAttributesToMap = userAttributesFromIdp;
return event;
};
CloudWatch Logs を見てみると、Lambda トリガー出力ログを確認することが出来ました。

さいごに
本日は Amazon Cognito ユーザープールの Lambda トリガーで新しいトリガータイプ「フェデレーション」が追加されたので使ってみました。
外部 IdP と連携させた時に Cognito 側で確認できるログ出力用途でも良いですし、マッピング時の加工など色々と用途がありそうですね。






