本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。

Temporary elevated access management (TEAM) for AWS IAM Identity Center とは、AWS が提供するオープンソースソリューションで、ユーザーに一時的な管理者権限を付与するための仕組みです。

** 画像は TEAM の GitHub より引用
TEAMを理解する公式ドキュメントは次のとおりです。
Temporary elevated access management (TEAM)
AWS Security Blog on 08 JUN 2023
builders.flash on 2025-05-01 | AWS Community Hero: 山口 正徳氏)
TEAMを導入する主なメリットは以下の5つです。
TEAMは以下の主要な機能を提供します。
利用者(申請者)は、Webベースのアプリケーションから一時的な管理者権限を申請できます。

申請時に指定可能な項目は次のようなものがあります。
申請後、設定された承認ポリシーに従って承認者に通知が送信されます。
承認者は申請内容を確認し、承認または拒否を判断します。
承認ワークフローの特徴は次のとおりです。
承認された申請は、指定された開始時刻に自動的にIAM Identity Centerで権限が付与されます。
TEAMはサーバーレスアーキテクチャで構築されており、以下のAWSサービスが連携して一時権限のライフサイクルを自動管理します。
この自動化により、手動での権限管理が不要になり、人的ミス(権限の付けっぱなしなど)を防止できます。
申請や承認のステータス変化を、複数のチャネルで通知できます。
サポートされる通知方法は次のとおりです。
通知は申請者、承認者の両方に送信され、承認待ちや承認完了などのステータスをタイムリーに把握できます。
すべてのアクセス履歴と操作ログが記録され、監査に対応できます。
監査機能は次のとおりです。
管理者は柔軟にポリシーを設定し、組織のセキュリティ要件に合わせた運用が可能です。
これらのポリシーにより、例えば「開発環境は承認不要で最大8時間」「本番環境は承認必須で最大4時間」といった柔軟な設定が可能です。
TEAMを効果的に運用するためのベストプラクティスと注意点を解説します。
TEAMアプリケーションの運用にかかる主なコストは以下の通りです。
主なコスト要素:
コスト最適化のポイント:
💡 一般的な中小規模の組織(ユーザー数50名程度、月間申請数100件程度)であれば、月額コストは数十ドル程度。
TEAMアプリケーションの健全性と利用状況を継続的に監視することが重要です。
TEAMを安全に運用するためのセキュリティベストプラクティスです。
💡 セキュリティインシデントが発生した場合は、TEAMアプリケーションの監査ログとCloudTrail Lakeを活用し、影響範囲を迅速に特定できます。
TEAMアプリケーションをTEAM管理用のAWSアカウントへデプロイするまでを解説します。
本ガイドで説明するデプロイの主な流れは以下の通りです。
**IAM Identity Centerの管理アカウントから、**以下の委任を実行します。
CloudShellや、ローカルからコマンドで実行が可能です。 ローカルから実行する場合は、コマンドの最後に、--profile xxxxx として管理アカウントのプロファイル名を指定します。
aws organizations register-delegated-administrator \
--account-id 111122223333 \
--service-principal sso.amazonaws.com
# 無効化する場合
aws organizations deregister-delegated-administrator \
--account-id 111122223333 \
--service-principal sso.amazonaws.com
aws organizations register-delegated-administrator \
--account-id 111122223333 \
--service-principal cloudtrail.amazonaws.com
# 無効化する場合
aws organizations deregister-delegated-administrator \
--account-id 111122223333 \
--service-principal cloudtrail.amazonaws.com
aws organizations enable-aws-service-access \
--service-principal account.amazonaws.com
aws organizations register-delegated-administrator \
--account-id 111122223333 \
--service-principal account.amazonaws.com
# 無効化する場合(有効化したときと逆の順番で無効化します)
aws organizations deregister-delegated-administrator \
--account-id 111122223333 \
--service-principal account.amazonaws.com
aws organizations disable-aws-service-access \
--service-principal account.amazonaws.com
委任状況は以下のコマンドで確認します。
aws organizations list-delegated-services-for-account \
--account-id 111122223333 \
--output text
以下のように出力されます。
#DELEGATEDSERVICES 2023-06-29T14:17:46.624000+00:00 account.amazonaws.com
#DELEGATEDSERVICES 2023-06-25T15:11:09.553000+00:00 cloudtrail.amazonaws.com
#DELEGATEDSERVICES 2023-06-25T14:56:02.172000+00:00 sso.amazonaws.com
このTEAMアプリケーションをデプロイするフローの中で、GitHubリポジトリのソースを取得する必要があります。そのためのアクセストークンを発行します。
発行手順は、GitHub Docsのここを参照してください。
権限は以下のように、[repo]をすべて指定します。

⚠️ 現状は、personal access token (classic)しか対応していません。そのため、アクセストークンは個人ユーザー管理になっています。(下記Issue参照)
Why classic GitHub tokens are required? https://github.com/aws-samples/iam-identity-center-team/issues/401
発行したアクセストークンをTEAM管理アカウントのシークレットマネージャーに登録します。
# 新規作成
SECRET_NAME="TEAM-IDC-APP"
aws secretsmanager create-secret \
--name "$SECRET_NAME" \
--description "GitHub repository credentials for TEAM application" \
--secret-string '{"url": "https://github.com/your-repository-name/iam-identity-center-team.git", "AccessToken": "xxxxxxx"}' \
--tags Key=Project,Value=YOUR_PROJECT_NAME Key=Env,Value="YOUR_ENV" \
--region "ap-northeast-1"
# 更新する場合
aws secretsmanager update-secret \
--secret-id "$SECRET_NAME" \
--description "GitHub repository credentials for TEAM application" \
--secret-string '{"url": "https://github.com/your-repository-name/iam-identity-center-team.git","AccessToken": "xxxxxxx"}' \
--tags Key=Project,Value=YOUR_PROJECT_NAME Key=Env,Value="YOUR_ENV" \
--region "ap-northeast-1"
TEAM管理アカウントのCloudShellまたは、プロファイル名を指定してローカルからAWS CLIにて実行します。
STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)
aws identitystore create-group --output yaml \\
--identity-store-id "${STORE_ID}" \\
--display-name "TEAM-Users" \\
--description "TEAM アプリケーションで一時的なアクセス権限をリクエストするユーザーグループ(開発者やオペレーターなど)"
aws identitystore create-group --output yaml \\
--identity-store-id "${STORE_ID}" \\
--display-name "TEAM-Approvers-Production" \\
--description "TEAM アプリケーションで本番アカウントへのリクエストをレビュー・承認 / 拒否する権限を持つユーザーグループ。ただし、自身のリクエストは自身では承認できません"
aws identitystore create-group --output yaml \\
--identity-store-id "${STORE_ID}" \\
--display-name "TEAM-Approvers-NonProduction" \\
--description "TEAM アプリケーションで本番アカウント以外へのリクエストをレビュー・承認 / 拒否する権限を持つユーザーグループ。ただし、自身のリクエストは自身では承認できません"
aws identitystore create-group --output yaml \\
--identity-store-id "${STORE_ID}" \\
--display-name "TEAM-Admins" \\
--description "TEAM アプリケーションの設定管理・ユーザー管理・グループ設定などを行うユーザーグループ"
aws identitystore create-group --output yaml \\
--identity-store-id "${STORE_ID}" \\
--display-name "TEAM-Auditors" \\
--description "TEAMアプリケーションのリクエスト履歴やアクセスログの確認・レビューを行うユーザーグループ (読み取り専用)"
作成したグループは以下のコマンドで確認できます。
aws identitystore list-groups --output table \\
--identity-store-id "${STORE_ID}" \\
--query "Groups[?starts_with(DisplayName, 'TEAM')].[DisplayName,GroupId,Description]"
以下のように表示されます
#-------------------------------------------------------------------------------------------------
#|ListGroups |
#+------------------------------+---------------------------------------+------------------------+
#| TEAM-Approvers-Production | 0744ba98-8031-70a4-061a-ada3cf44ca14 | xxxxx |||
#| TEAM-Auditors | 37549a08-5081-702d-0063-15540c1d1abe | xxxxx ||
#| TEAM-Users | 4754aa28-9041-7094-5ccc-3f27cacb7e2e | xxxxx |||
#| TEAM-Admins | 6774ea58-2061-7071-b591-8b4d3fd32f0a | xxxxx ||
#| TEAM-Approvers-NonProduction| f7e44ab8-6091-704c-4461-e6f241837f74 | xxxxx |||
#+------------------------------+---------------------------------------+-----------------------+
TEAM管理アカウントのCloudShellまたは、プロファイル名を指定してローカルからAWS CLIにて実行します。
EDS_NAME="TEAM-audit-logs"
aws cloudtrail create-event-data-store \
--name "$EDS_NAME" \
--multi-region-enabled \
--organization-enabled \
--retention-period 365 \
--no-termination-protection-enabled \
--tags-list Key=Project,Value=YOUR_PROJECT_NAME Key=Env,Value=YOUR_ENV \
--region "ap-northeast-1"
削除するときは以下のコマンドを使用します。
aws cloudtrail delete-event-data-store \
--event-data-store "$EDS_NAME" \
--region "ap-northeast-1"
git clone https://github.com/aws-samples/iam-identity-center-team.git
すでにデプロイ用パラメータが作成済みの場合は本手順をスキップします。
cd deployment
cp -n parameters-dev.sh parameters_YOUR_ENV.sh
コピーしたデプロイ用パラメータファイルを修正します。
作成したデプロイ用パラメータファイルを使用してデプロイを実行します。
PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./deploy_custom.sh

このデプロイを実行すると、下記2つのCloudFormationスタックが作成されます。「amplify-teamidcapp-main」スタックは「TEAM-IDC-APP」作成後、5分程度時間が経ってから作成されます。また、複数のスタックをネストしており、すべてのスタックが完了するまで15分くらいかかります。
ステップ3ですべてのスタックが「CREATE_COMPLETE」になっていることを確認してから実行します。

以下のコマンドを実行します。
PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./integration_custom.sh

実行すると、以下のURLが払い出されます。この値は次の手順で使用しますので、メモしておきます。
applicationStartURL: https://xxxxxx-main.auth.amazoncognito.com/authorize?client_id=xxxxxx&response_type=code&scope=aws.cognito.signin.user.admin+email+openid+phone+profile&redirect_uri=https://main.d1s8z5724fsfj7-.amplifyapp.com/&idp_identifier=team
applicationACSURL: https://xxxxxx-main.auth.amazoncognito.com/saml2/idpresponse
applicationSAMLAudience: urn:amazon:cognito:sp:us-east-1_xxxxxx
TEAM管理アカウントのAWSマネジメントコンソールから、[AWS IAM Identity Center console > Application assignment > Applications > Add application] を開きます。
TEAM IDC APPTemporary elevated access management (TEAM) for AWS IAM Identity CenterIAM Identity Center SAML メタデータファイルのURLはAmazon Cognitoの設定で必要ですので、メモしておきます。https://portal.sso.ap-northeast-1.amazonaws.com/saml/metadata/xxxxxxxxapplicationStartURLの値を入力します。applicationACSURLとapplicationSAMLAudienceの値を入力します。https://xxxxxx-main.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponseurn:amazon:cognito:sp:ap-northeast-1_xxxxxxSubjectとEmailを設定します。
TEAM-で始まるグループ名)をすべて割り当てます。

以下のコマンドでコピーしたJSONファイルを開き、MetadataURLにIAM Identity Center SAML メタデータファイルのURLを記載します。 すでにファイルが存在する場合は、そのまま編集してください。
cd deployment
cp -n details_dev.json details_YOUR_ENV.json
JSONファイルは以下のようになっています。
{
"MetadataURL": "https://portal.sso.ap-northeast-1.amazonaws.com/saml/metadata/xxxxxxxxxxxxxxxx"
}
以下のコマンドで設定を実行します。
PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./cognito_custom.sh
画面出力が複数行でますので、コンソール画面ではqを押して表示を終了させます。

see: TEAM Deployment guide
see: https://aws-samples.github.io/iam-identity-center-team/docs/deployment/configuration/notifications.html#email-notification-via-amazon-ses
TEAM管理アカウントのAWSマネジメントコンソールから、[Amazon SES > 設定: ID]を開きます。
example.comを入力します。Easy DKIMを選択し、キーの長さをRSA_2048_BITに指定します。検証保留中から検証済みになるまで待機します。

「02. Administrator Guide」に従い、設定を行います。
TEAMアプリケーションをアンインストールする手順です。destroy_custom.sh を実行することでデプロイ時に作成したスタックが削除されます。
ただし、Amplify デプロイメントの S3 バケットが削除されないため、手動での削除が必要です。s3バケット名の形式はamplify-teamidcapp-main-xxxx-deploymentです。
カレントディレクトリがdeployment ではない場合は移動します。
cd deployment
以下のコマンドでアンインストールを実行します。
PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./destroy_custom.sh

:

AWSマネジメントコンソールで、[CloudFormation]にアクセスすると、「DELETE_IN_PROGRESS」となり、削除が実施されます。

⚠️アンインストール前に、権限委任の解除が実施されていると「CloudTrail Lake EventDataStore」の削除が権限不足で失敗し、スタックの削除にも失敗します。この場合、リソースは残したうえでスタックの強制削除を行ってください。残ってしまった「CloudTrail Lake EventDataStore」は、IAM Identity Centerの管理アカウント上から手動で削除します。
S3バケットを削除します。

TEAM管理アカウントのCloudShell上に貼り付けて実行します。
aws s3api list-buckets \
--query "Buckets[?starts_with(Name, 'amplify-teamidcapp-main-')].Name" \
--output text | \
tr '\t' '\n' | \
while read -r BUCKET_NAME; do
echo "バケットを削除中: ${BUCKET_NAME}"
# 1. 通常のオブジェクトを削除
echo " - オブジェクトを削除中..."
aws s3 rm "s3://${BUCKET_NAME}" --recursive > /dev/null 2>&1
# 2. すべてのバージョンと削除マーカーを削除
echo " - すべてのバージョンを削除中..."
aws s3api list-object-versions \
--bucket "${BUCKET_NAME}" \
--output json \
--query '{Objects: Versions[].{Key:Key,VersionId:VersionId}}' 2>/dev/null | \
jq -c 'if .Objects then . else empty end' | \
while read -r DELETE_JSON; do
if [ "$DELETE_JSON" != "" ] && [ "$DELETE_JSON" != '{"Objects":null}' ]; then
aws s3api delete-objects \
--bucket "${BUCKET_NAME}" \
--delete "$DELETE_JSON" > /dev/null
fi
done
# 3. 削除マーカーを削除
echo " - 削除マーカーを削除中..."
aws s3api list-object-versions \
--bucket "${BUCKET_NAME}" \
--output json \
--query '{Objects: DeleteMarkers[].{Key:Key,VersionId:VersionId}}' 2>/dev/null | \
jq -c 'if .Objects then . else empty end' | \
while read -r DELETE_JSON; do
if [ "$DELETE_JSON" != "" ] && [ "$DELETE_JSON" != '{"Objects":null}' ]; then
aws s3api delete-objects \
--bucket "${BUCKET_NAME}" \
--delete "$DELETE_JSON" > /dev/null
fi
done
# 4. バケット自体を削除
echo " - バケットを削除中..."
aws s3api delete-bucket --bucket "${BUCKET_NAME}"
if [ $? -eq 0 ]; then
echo "✓ 削除成功: ${BUCKET_NAME}"
else
echo "✗ 削除失敗: ${BUCKET_NAME}"
fi
done





⚠️ ステップ4を先に実行した場合はエラーになります。このエラーは、グループとの紐づけ情報が不正になっているためですので、「割り当てられたユーザーとグループ」をすべて削除することで、削除できるようになります。
TEAM管理アカウントのCloudShell上に貼り付けて実行します。
STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)
# 各グループを削除
aws identitystore list-groups \
--identity-store-id "${STORE_ID}" \
--output json | \
jq -r '.Groups[] | select(.DisplayName | startswith("TEAM-")) | "\(.GroupId)\t\(.DisplayName)"' | \
while IFS=$'\t' read -r GROUP_ID GROUP_NAME; do
echo "グループを削除中: ${GROUP_NAME} (ID: ${GROUP_ID})"
aws identitystore delete-group \
--identity-store-id "${STORE_ID}" \
--group-id "${GROUP_ID}"
if [ $? -eq 0 ]; then
echo "✓ 削除成功: ${GROUP_NAME}"
else
echo "✗ 削除失敗: ${GROUP_NAME}"
fi
done

役割名 | 主な役割 | グループ名 |
申請者 | TEAM アプリケーションで一時的なアクセス権限をリクエストするユーザーグループ(開発者やオペレーターなど) | TEAM-Users |
承認者 | TEAM アプリケーションで本番アカウントへのリクエストをレビュー・承認 / 拒否する権限を持つユーザーグループ。ただし、自身のリクエストは自身では承認できません | TEAM-Approvers-Production |
承認者 | TEAM アプリケーションで本番アカウント以外へのリクエストをレビュー・承認 / 拒否する権限を持つユーザーグループ。ただし、自身のリクエストは自身では承認できません | TEAM-Approvers-NonProduction |
管理者 | TEAM アプリケーションの設定管理・ユーザー管理・グループ設定などを行うユーザーグループ | TEAM-Admins |
監査者 | TEAMアプリケーションのリクエスト履歴やアクセスログの確認・レビューを行うユーザーグループ (読み取り専用) | TEAM-Auditors |
TEAMアプリケーションを利用したAWSアカウントへの一時アクセス許可申請を行う方法を説明します。





see: TEAM Requestor guide




see: TEAM Requestor guide


💡 申請ステータスが「approved」になっている場合、申請時に指定した[Start time]以降にAWSアクセスポータルを表示すると、申請したAWSアカウントが表示されるようになります。表示されない場合は、TEAM管理者に連絡してください。
⚠️ アクセス有無にかかわらず、申請した作業時間が過ぎた場合は自動的にアクセス許可が削除されます。
see: TEAM Requestor guide

⚠️ 一度キャンセルした申請は、もとに戻すことはできません。再度申請を行ってください。
初期構築時点では、IAM Identity Centerで定義されている「TEAM-Admins」グループに登録されている人が、TEAMアプリケーションを管理できます。
TEAMアプリケーション管理者はAdministrationメニューにある以下のことが実施できます。

⚠️ 「管理者グループ」に所属するメンバーであっても、「承認者グループ」に割り当てない限り、申請承認の操作を行うことはできません。




⚠️ グループにユーザーを追加した直後は、AWSアクセスポータルの画面にTEAMアプリケーションが表示されないことがあります。その場合は、AWSアクセスポータルの画面でログオフし、再度ログインを行ってください。
初期構築時点では、IAM Identity Centerで定義されている「TEAM-Auditors」グループに登録されている人が、TEAMアプリケーションでの申請承認履歴やアクティビティを参照できます。
TEAMアプリケーション管理者はAuditメニューにある以下のことが実施できます。

TEAMアプリケーション監査者を追加する手順は、「TEAMアプリケーション管理者」と同様となりますのでそちらを参照してください。「TEAM-Auditors」に対してユーザーを追加または削除します。

初期構築時点では、IAM Identity Centerで定義されている「TEAM-Users」グループに登録されている人が、TEAMアプリケーションを利用できます。
TEAMアプリケーションの利用可否を制御するには、このグループにメンバーを追加または削除します。
TEAMアプリケーション監査者を追加する手順は、「TEAMアプリケーション管理者」と同様となりますのでそちらを参照してください。「TEAM-Users」に対してユーザーを追加または削除します。

次の手順「申請者ポリシーを管理する」にあるように申請者グループに対して、アカウントやOUの単位で、どの許可セットが申請可能か、といった細かい制御が可能です。
複数の申請者グループで管理を細分化したい場合は、IAM Identity Centerでグループを作成してください。
申請者のグループごとにAWSアカウントまたは、OU単位で、申請時に選択可能な権限(許可セット)や承認フローが必須かどうかを設定できます。
初期構築時点では、「TEAM-Users」のグループが[アカウント指定+許可セット+承認必須]という定義になっています。
⚠️ 対象アカウントを指定しているので、AWSアカウントを追加した場合は、修正が必要です。
💡 OU単位でのポリシーを作成すると、AWSアカウントの増減に対するメンテナンスは必要なくなりますが、広い範囲での申請が可能になってしまいます。


Not requiredにした場合は、この設定に関係なく承認不要になります。see: https://aws-samples.github.io/iam-identity-center-team/docs/guides/admin.html#configure-approver-policy


⚠️ 複数アカウント×複数承認グループを設定すると、ポリシーはそれぞれの組み合わせごとに分割されます。修正する場合は、個別に実施する必要があります。

see: https://aws-samples.github.io/iam-identity-center-team/docs/guides/admin.html#configure-team-settings


ここで申請承認を無効にすると、TEAMアプリケーション全体で承認が不要になります。
申請承認を有効にすると、申請者ポリシーで指定した動作に従って承認の有無が判断されます。
RequiredかNot requiredに変更します

RequiredかNot requiredに変更します

RequiredかNot requiredに変更します

ここで指定した時間を超える利用時間で申請ができなくなります。
Maximum request durationに期限切れとなる[時間]を数字で入力します
未承認リクエストは指定した時間を過ぎると期限切れとなり、再申請が必要になります。

ONに変更します

Source emailを入力します
ONに変更します

⚠️ SNSはTEAMアプリケーションデプロイ時に作成されています。通知を受信するにはTEAM管理用AWSアカウントのマネジメントコンソールから、「Simple Notification Service」を開き TeamNotifications-main のトピックへのサブスクリプション登録を行ってください。
ONに変更します


Slack OAuth tokenとSlack Audit Channelを入力します「申請を承認する」の手順と同様ですが、手順4で[Actions]から[Reject]を選択します。
TEAMアプリケーションの申請やセッションのアクティビティ等の監査を行う方法を説明します。
see: TEAM Auditor guide





see: TEAM Auditor guide




本記事では、AWS IAM Identity Center向けの一時的な権限昇格管理ソリューション「TEAM(Temporary Elevated Access Management)」について、導入から運用までを包括的に解説しました。
TEAMは、AWSが提供するオープンソースソリューションとして、以下の特徴を備えています。
TEAMを導入することで、以下のような効果が期待できます。
TEAMを導入する際は、以下の点を考慮してください。
TEAMを導入した後は、以下のステップで継続的に改善していくことをお勧めします。
TEAMに関するさらに詳しい情報は、以下の公式リソースを参照してください。
TEAMは、AWS環境におけるゼロスタンディング特権の実現と、特権アクセス管理の自動化・可視化を実現する強力なソリューションです。本記事が、皆様のセキュリティ向上とコンプライアンス対応の一助となれば幸いです。