チームアクセスの管理
Amplify Studioを使用すると、異なる職務を持つチームメンバーがAmplifyにデプロイされたプロジェクトの異なる側面で共同作業できます。Studio開発者は、管理者または管理のみのアクセス権を持つアカウントを作成でき、メールでチームメンバーを招待できます。
以下の手順に従って、チームメンバーを追加し、プロジェクトへのアクセスを管理してください。
チームメンバーをプロジェクトアクセスに招待するには
- AWS管理コンソールにサインインしてAWS Amplifyを開きます。
- Amplify Studioが有効になっているAmplifyプロジェクトを選択します。
- ナビゲーションペインで、Amplify Studioの設定を選択します。
- Amplify Studioの設定ページのアクセス制御設定セクションで、チームメンバーを追加を選択します。
- メールに、招待するチームメンバーのメールアドレスを入力します。
- アクセスレベルで、チームメンバーに付与するアクセスレベルを選択します。
- フルアクセスにより、チームメンバーはAWSリソースを作成および管理できます。
- 管理のみアクセスにより、チームメンバーはアプリコンテンツとユーザーを編集できます。
- 招待メールを送信するには、招待を送信を選択します。チームメンバーは、一時的な認証情報とStudioでプロジェクトにアクセスするためのリンクが記載されたメールを受け取ります。
チームメンバーのアクセスを編集するか、ユーザーを削除するには
- AWS管理コンソールにサインインしてAWS Amplifyを開きます。
- Amplify Studioが有効になっているAmplifyプロジェクトを選択します。
- ナビゲーションペインで、Amplify Studioの設定を選択します。
- Amplify Studioの設定ページのアクセス制御設定セクションで、編集または削除するチームメンバーを選択します。
- 以下のいずれかを実行します。
- 編集を選択します。チームメンバーの編集ウィンドウで、チームメンバーのアクセスレベルを選択します。
- 削除を選択します。ユーザーを削除ウィンドウで、削除アクションを確認します。
Studioがユーザーアクセスを管理する方法を理解する
ユーザープール
Studioはアカウント内のAmazon Cognito User Poolを使用してユーザーアクセスを管理します。コスト無料でStudioに最大50,000人の月次ユーザーを招待できます。
Studioはアカウント内のAmazon Cognito User Poolを使用してユーザーアクセスを管理し、名前は以下の通りです。
- amplify_backend_manager_APPID。
IAMロール
フルアクセスおよび管理のみグループに必要なアクセス許可を付与するため、Studioは2つのIAMロール(以下の名前)を作成します。
- USERPOOLID_Full-access
- USERPOOLID_Manage-only
Cognito Identity Pool
Amazon Cognito Identity Poolも作成され、フルアクセスおよび管理のみグループに関連付けられたAWS認証情報を発行し、名前は以下の通りです。
- amplify_backend_manager_APPID
Cognito Lambda トリガー
AWS Amplify ConsoleからAmplify Studioへのパスワードレスログインエクスペリエンスを提供するため、Studioは4つのCognito Lambda トリガー(上記のUser Poolに関連付けられた)を作成し、名前は以下の通りです。
- amplify-login-create-auth-challenge-SHORT_CODE
- amplify-login-custom-message-SHORT_CODE
- amplify-login-define-auth-challenge-SHORT_CODE
- amplify-login-verify-auth-challenge-SHORT_CODE
トラブルシューティング
Studioアプリケーションでログインに問題が発生した場合、またはリソースが削除された場合は、Amplify管理コンソールでAmplifyプロジェクトのStudioを無効にしてから再度有効にすることにより、リソースを再作成できます。
- AWS管理コンソールにサインインしてAWS Amplifyを開きます。
- Amplify Studioが有効になっているAmplifyプロジェクトを選択します。
- ナビゲーションペインで、Amplify Studioの設定を選択します。
- Amplify Studioを有効化をオフにします。
- Amplify Studioを有効化をオンにします。
Amplifyでアクションを実行する権限がない
アクションを実行する権限がないというエラーが表示される場合は、ポリシーを更新してアクションを実行できるようにする必要があります。
ヘルプが必要な場合は、AWSアドミニストレータに問い合わせてください。アドミニストレータは、サインイン認証情報を提供した人です。詳細については、AWS Amplifyのためのパネルポリシーを参照してください。
Cognito Lambda トリガーのログインランタイムを更新する
Cognito Lambda トリガーランタイムを更新する必要がある場合は、Cognito User Pool amplify_backend_manager_<app-id> に関連付けられたLambda関数トリガーを更新することで実行できます。
- AWS管理コンソールにログインし、Amplifyコンソールを開き、Amplify Studioが有効になっているAmplifyプロジェクトを選択します。
- 概要ページのアプリ名の下にあるアプリIDを取得します。
- Amazon Cognito コンソールに移動し、ユーザープールを選択します。アプリIDを使用してユーザープールを検索します。アプリIDを使用した
amplify_backend_manager_<app-id>の命名形式のユーザープールが表示されます。 - ユーザープールを選択し、ユーザープールのプロパティに移動します。Lambda トリガーが表示されるはずです。
- Lambda トリガーごとに、アタッチされたLambda関数列に指定されたリンクを選択します。注意として、Lambda トリガーが認証チャレンジレスポンスを検証するLambda トリガーの場合、関数には認証チャレンジレスポンスを検証するLambda トリガーを更新セクションで提供される追加のステップが必要です。
- ランタイム設定を編集を選択し、ドロップダウンオプションからNode.js 20.xにランタイムを変更します。
- 最後に、保存を選択します。
認証チャレンジレスポンスを検証するLambda トリガーを更新する
この関数には、NodeJS 20.xのLambdaがaws-sdkの新しいバージョンを使用するため、コード変更が必要です。
- Lambda Code Sourceに移動し、
index.jsファイルを選択します。 index.jsの内容を以下に置き換えます。
const { AmplifyBackendClient, GetTokenCommand, DeleteTokenCommand } = require('@aws-sdk/client-amplifybackend');
exports.handler = async (event, context) => { try { const amplifyBackendService = new AmplifyBackendService(event); await amplifyBackendService.validateToken(); console.log(`verified challenge code with result: ${event.response.answerCorrect}`); context.done(null, event); return event; } catch (e) { console.error('exception occurred during verify', e); event.response.answerCorrect = false; context.done(e, event); }};
class AmplifyBackendService { constructor(event) { const { sessionId, appId } = event.request.clientMetadata; const { challengeAnswer } = event.request; this.appId = appId; this.sessionId = sessionId; this.challengeAnswer = challengeAnswer; this.event = event; }
async validateToken() { this.amplifyBackend = this.initService(); // 1. Get token const tokenResponse = await this.getToken();
// 2. Validate token const challengeCode = tokenResponse.ChallengeCode; if (challengeCode && this.challengeAnswer && this.challengeAnswer === challengeCode) { this.event.response.answerCorrect = true; } else { this.event.response.answerCorrect = false; }
// 3. Delete token await this.deleteToken();
return this.event.response.answerCorrect; }
initService() { const amplifyBackend = process.env.ENDPOINT ? new AmplifyBackendClient({ endpoint: process.env.ENDPOINT, }) : new AmplifyBackendClient(); return amplifyBackend; }
getToken() { return this.amplifyBackend.send( new GetTokenCommand({ AppId: this.appId, SessionId: this.sessionId, }), ); }
deleteToken() { return this.amplifyBackend.send( new DeleteTokenCommand({ AppId: this.appId, SessionId: this.sessionId, }), ); }}
exports.AmplifyBackendService = AmplifyBackendService;- 最後に、デプロイを選択して変更を保存します。