🫂

TEAM for AWS IAM Identity Center 導入ガイド ──(2/6) デプロイ

に公開

本ガイドは、全6部構成となっています。

☘️ はじめに

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

最新の情報については、AWS 公式ドキュメントをご参照ください。
手順画像などの一部は公式ドキュメントの画像を流用しております。

TEAM

本ページでは、TEAMのデプロイ方法について解説します。

📌 対象読者

  • TEAM導入担当者: TEAMアプリケーションを初めて導入する方
  • AWSインフラ担当者: AWS CDKを使用してデプロイを行う技術者

👀 Contents

1. デプロイ方法

TEAMアプリケーションをTEAM管理用のAWSアカウントへデプロイするまでを解説します。

デプロイの流れ

本ガイドで説明するデプロイの主な流れは以下の通りです。

  1. デプロイ前準備
    1. IAM Identity Centerの管理アカウントからTEAM管理アカウントへ管理の委任を行う
    2. TEAMのGitリポジトリをCloneし、リポジトリにアクセスするためのpersonal access token (classic)を発行する
    3. TEAMで使用するIAM Identity Centerのグループを作成する
  2. デプロイ実施
    1. デプロイ用のシェルを実行し、デプロイを行う
  3. (Nextアクション ※本ガイド対象外)「02. Administrator Guide」に従い、設定を行う

デプロイ前準備

ステップ1: AWS IAM Identity Centerの管理アカウントからTEAM管理アカウントへの権限委任

see: TEAM Deployment guide > Dedicated TEAM account

**IAM Identity Centerの管理アカウントから、**以下の委任を実行します。

CloudShellや、ローカルからコマンドで実行が可能です。
ローカルから実行する場合は、コマンドの最後に、--profile xxxxx として管理アカウントのプロファイル名を指定します。

  • IAM Identity Center
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
  • CloudTrail Lake
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
  • Account management
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-0X-ZZT12:34:56.123456+00:00        account.amazonaws.com
#DELEGATEDSERVICES       2023-0X-ZZT11:22:33.123456+00:00        cloudtrail.amazonaws.com
#DELEGATEDSERVICES       2023-0X-ZZT22:33:44.123456+00:00        sso.amazonaws.com

ステップ2: personal access token (classic) の作成とAWS Secrets Managerへの登録

see: TEAM Deployment guide > AWS Secrets Manager

このTEAMアプリケーションをデプロイするフローの中で、GitHubリポジトリのソースを取得する必要があります。そのためのアクセストークンを発行します。

発行手順は、GitHub Docsのここを参照してください。

権限は以下のように、[repo]をすべて指定します。

WS000930.jpg

⚠️ 現状は、personal access token (classic)しか対応していません。そのため、アクセストークンは個人ユーザー管理になっています。(Issue参照>Why classic GitHub tokens are required?

発行したアクセストークンを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"

ステップ3: TEAMで利用する IAM Identity Center グループの作成

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       |||
#+------------------------------+---------------------------------------+-----------------------+

ステップ4: CloudTrail Lake EventDataStoreの作成

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"

デプロイ

ステップ1: GitHubリポジトリのクローン

git clone https://github.com/aws-samples/iam-identity-center-team.git
💡Tips

公式のデプロイ手順では、パラメータファイルはparameters.sh固定を想定したものとなっております。
ただ、検証中のTEAM管理アカウントと本番導入のTEAMアカウントが異なる場合など、環境別でパラメータファイルを切り替えたい場合があります。

そのような場合、以下のような関数を呼び出すように変更したカスタムシェルにすることで対応が可能です。

実装例:

function load_parameters_file() {
    local parameters_file="${PARAMETERS_FILE:-${DEFAULT_PARAMETERS_FILE:-"./parameters.sh"}}"
    
    if [ ! -f "$parameters_file" ]; then
        echo "エラー: パラメータファイル '$parameters_file' が見つかりません。" >&2
        exit 1
    fi
    
    echo "パラメータファイルを読み込み中: $parameters_file"
    # shellcheck source=/dev/null
    . "$parameters_file"
}
# Before
# パラメータファイルの読み込み
. "./parameters.sh"

# After
# パラメータファイルの読み込み
load_parameters_file

⚠️ 本手順で示す画像では、環境別パラメータファイルを指定できる方法で実行した画像となっています。実行コマンドは異なりますが、画面表示内容は同一です。

ステップ2: デプロイ用パラメータの作成

すでにデプロイ用パラメータが作成済みの場合は本手順をスキップします。

cd deployment
cp -n parameters-template.sh parameters.sh

#環境別パラメータファイルを使う場合
#cp -n parameters-template.sh parameters_YOUR_ENV.sh

コピーしたデプロイ用パラメータファイルを修正します。

ステップ3: デプロイ実行

作成したデプロイ用パラメータファイルを使用してデプロイを実行します。

./deploy.sh

#環境別パラメータファイルを使う場合
#PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./deploy_custom.sh

WS000938.jpg

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

  • TEAM-IDC-APP
  • amplify-teamidcapp-main-xxxxx

ステップ4: IAM Identity Center SAML Integrationの設定

see: TEAM Deployment guide > IAM Identity Center Integration

ステップ3ですべてのスタックが「CREATE_COMPLETE」になっていることを確認してから実行します。

WS000982.jpg

以下のコマンドを実行します。

./integrations.sh

#環境別パラメータファイルを使う場合
#PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./integration_custom.sh

WS000936.jpg

実行すると、以下の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://xxxxx.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] を開きます。

  • [設定するアプリケーションがある > SAML 2.0] を選択し、[次へ]をクリックします

  • 以下を設定します。

    • 表示名: TEAM IDC APP
    • 説明: Temporary elevated access management (TEAM) for AWS IAM Identity Center
  • 「IAM Identity Center メタデータ」のIAM Identity Center SAML メタデータファイルのURLはAmazon Cognitoの設定で必要ですので、メモしておきます。

    • IAM Identity Center SAML メタデータファイル: https://portal.sso.ap-northeast-1.amazonaws.com/saml/metadata/xxxxxxxx
  • [Application start URL]に先ほどシェルの実行で表示されたapplicationStartURLの値を入力します。

  • [Application Metadata]では、applicationACSURLapplicationSAMLAudienceの値を入力します。

    • applicationACSURL: https://xxxxxx-main.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse
    • applicationSAMLAudience: urn:amazon:cognito:sp:ap-northeast-1_xxxxxx
  • 作成したアプリケーションを開きます。

  • [アクション>属性マッピング]を開きます。

    • SubjectEmailを設定します。

      • Subject - ${user:subject} - persistent
      • Email - ${user:email} - basic

      WS000946.jpg

    • [変更の保存]をクリックし、保存します。

  • [割り当てられたユーザーとグループ]にTEAM用のグループ(TEAM-で始まるグループ名)をすべて割り当てます。

    WS000939.jpg

    WS000940.jpg

    • ⚠️ アプリケーションにグループを割り当ててもグループのメンバーとして登録されていなければ、アプリケーションを利用できません。「02. Administrator Guide」を参照し、グループにメンバーを割り当ててください。
    • ⚠️ グループに割り当てても、AWS access portalをログアウトしてから再ログインするまで、アプリケーションが表示されない場合があります。表示されない場合は、ログアウトしてください。

ステップ5: Amazon Cognitoの設定

see: TEAM Deployment guide > Cognito user pool configuration

以下のコマンドでコピーしたJSONファイルを開き、MetadataURLIAM 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"
}

以下のコマンドで設定を実行します。

./cognito.sh

#環境別パラメータファイルを使う場合
#COGNITO_IDP_JSON=details_YOUR_ENV.json PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./cognito_custom.sh

画面出力が複数行でますので、コンソール画面ではqを押して表示を終了させます。

WS000937.jpg

ステップ6: Amazon SESの設定

see: TEAM Deployment guide > Email notification via Amazon SES

TEAM管理アカウントのAWSマネジメントコンソールから、[Amazon SES > 設定: ID]を開きます。

  • [IDの作成]

  • [ドメイン]を選択し、ドメイン名にexample.comを入力します。

  • Easy DKIMを選択し、キーの長さをRSA_2048_BITに指定します。

  • [DNS レコードの発行]の3レコードをRoute 53のホストゾーンへ設定します。

  • [ID ステータス]が検証保留中から検証済みになるまで待機します。

    WS000974.jpg

    WS000977.jpg

2. デプロイ後のステップ

TEAM for AWS IAM Identity Center 導入ガイド ──(5/6) 管理者向けガイドに従い、設定を行います。

3. アンインストール

TEAMアプリケーションをアンインストールする手順です。destroy_custom.sh を実行することでデプロイ時に作成したスタックが削除されます。

ただし、Amplify デプロイメントの S3 バケットが削除されないため、手動での削除が必要です。s3バケット名の形式はamplify-teamidcapp-main-xxxx-deploymentです。

see: TEAM Deployment guide > Uninstall TEAM solution

ステップ1: アンインストール

カレントディレクトリがdeployment ではない場合は移動します。

cd deployment

以下のコマンドでアンインストールを実行します。

PARAMETERS_FILE=./parameters_YOUR_ENV.sh ./destroy_custom.sh

deployimage02

:

deployimage03

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

deployimage04

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

ステップ2: S3バケットの削除

S3バケットを削除します。

deployimage05

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

image06

ステップ3: IAM Identity Center から TEAM アプリの削除

  1. TEAM管理アカウントのAWSマネジメントコンソールを開きます

  2. IAM Identity Centerコンソールにアクセスします

  3. 左ペインから、[アプリケーションの割り当て>アプリケーション]を選択します

    deployimage07

  4. [カスタマー管理]タブを開きます

    deployimage08

  5. 削除したいアプリケーションを選択し、右上の[アクション > 削除]を選択します

    deployimage09

  6. 削除確認を行い、削除を実行します

    deployimage10

⚠️ ステップ4を先に実行した場合はエラーになります。このエラーは、グループとの紐づけ情報が不正になっているためですので、「割り当てられたユーザーとグループ」をすべて削除することで、削除できるようになります。

ステップ4: TEAMで利用していた IAM Identity Center グループの削除

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

deployimage11

📖 まとめ

本記事では、AWS IAM Identity Center向けの一時的な権限昇格管理ソリューション「TEAM(Temporary Elevated Access Management)」について、デプロイ方法について解説しました。

デプロイの流れ

TEAMのデプロイは以下の手順で行います。

  1. 前提条件の確認

    • AWS Organizationsの有効化
    • IAM Identity Centerの有効化(委任された管理者アカウントに設定)
    • Node.js、AWS CLI、AWS CDKのインストール
  2. 環境のセットアップ

    • GitHubリポジトリのクローン
    • 依存パッケージのインストール
    • 設定ファイル(config.json)の編集
  3. CDKによるデプロイ

    • cdk bootstrapでCDK環境の初期化
    • cdk deployでAWSリソースの作成
    • CloudTrail Lakeの有効化とSESメール送信設定

ただし、デプロイ前に以下の点に注意してください。

  • 委任された管理者アカウントへのデプロイが必須
  • CloudTrail Lakeの有効化には追加コストが発生
  • SESの本番環境利用にはサンドボックス解除申請が必要

次のステップ

次の記事「TEAM導入ガイド(3/6) Deep Dive編」では、Step Functionsによる権限ライフサイクル管理やDynamoDBのテーブル設計など、TEAMの内部実装を詳しく解説します。

また、すぐに運用を開始したい方は、以下のガイド記事から役割に応じた記事を参照してください。

参考リソース

TEAMに関するさらに詳しい情報は、以下の公式リソースを参照してください。

GitHubで編集を提案

Discussion