AWS開発環境の3分クッキング！IAM Identity CenterとDev Containerの活用

# はじめに

AWS の開発環境として IDE を準備する際、手間だと感じたことはありませんか？例えば、各種インストールやアクセスキーの設定など、開発者にとっては煩わしい作業です。また、チーム内で同様の初期セットアップを繰り返すのは、避けたいところです。

本記事では、**セキュアかつ迅速に AWS 開発できる環境**の構築方法を解説します。AWS 開発環境の構築を省きたい方、特にエンタープライズ企業で AWS 開発に携わるエンジニアの方々にオススメです。

:::note
**本記事のポイント**
- AWS IAM Identity Center の設定を引用し、Dev Container でプロファイルを作成
- IDE から、クレデンシャルレスで AWS CLI を利用
- 開発環境の構築手順を大幅に削減し、セキュアなアクセスを実現
:::

# 構成図

構成図は以下の通りです。ユーザー管理に Microsoft Entra ID を採用しており、GitHub と AWS へのシングルサインオンを実現しています。**3つの簡単なステップ**で開発環境が構築され、数分で AWS 環境へアクセスできます。

![構成図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/67c63236-886b-d498-c898-fa78af3a5b2f.png)

## 本構成のメリット

1. **シングルサインオン**:  
  Microsoft Entra ID の認証情報のみで、GitHub と複数の AWS アカウント・ロールへシームレスにアクセス可能
2. **AWS リソースへの迅速な操作**:  
  GitHub Codespaces 起動後、`aws sso login` コマンド一つでAWSリソースを操作可能
3. **クレデンシャルレスによるセキュリティ向上**:  
  クレデンシャルのセットアップが不要になるため、アクセスキー漏洩リスクを抑制
4. **一元的なアクセス制御**:  
  AWS IAM Identity Center でアクセス権限を一元管理し、プロファイル切替で柔軟なアクセス制御が可能
5. **開発効率の最大化**:  
  開発環境の準備時間を削減し、開発者はすぐにコーディングへ着手可能

# 実際にアクセスしてみる

[① Codespaces 起動](#-codespaces-起動)  
[② SSO ログイン](#-sso-ログイン)  
[③ 認証コード確認 & データアクセス許可](#-認証コード確認--データアクセス許可)

## ① Codespaces 起動

まずは、GitHub リポジトリの任意ブランチから、Codespaces を起動します。

![Codespaces 起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/4e021fc5-ae59-9975-d14c-64e3229232af.png)

Codespaces 用のウィンドウへ自動遷移します。並行して devcontainer.json で定義している初期セットアップが実行されます。利用しているイメージで異なりますが、暫くするとターミナルに以下メッセージが表示されます。

```: Codespaces 起動メッセージ
👋 Welcome to Codespaces! You are on a custom image defined in your devcontainer.json file.

🔍 To explore VS Code to its fullest, search using the Command Palette (Cmd/Ctrl + Shift + P)

📝 Edit away, then run your build command to see your code running in the browser.
```

## ② SSO ログイン

Codespaces のターミナルから、以下のコマンドで SSO ログインを実行します。

```bash: SSO ログイン
$ aws sso login --profile CdkDeployment # プロファイルはdevconatinerで事前に作成
```

自動的に以下のポップアップが表示されます。

![ポップアップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/7ab8401b-36c0-b7d8-7375-c4cca337a8ce.png)

「開く」をクリックすると、ブラウザの別ウィンドウが開きます。

## ③ 認証コード確認 & データアクセス許可

別ウィンドウで、認証コードの確認が求められます。Codespaces のターミナルで表示されていたコードと一致していれば、「確認して続行」をクリックしてください。

![認証コード確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/4573c878-a724-9b6a-db84-828fff127cfe.png)

次にデータアクセス許可を求められますので、「許可」をクリックしてください。

![データアクセス許可](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/0777d071-2fbe-d3aa-ce25-4cf002873ec9.png)

その後、Codespaces のターミナルに戻ると以下のメッセージが表示されます。

```: SSO ログイン成功メッセージ
Successfully logged into Start URL: https://{IdentityStoreID}.awsapps.com/start#/
```

:::note
シンプルな構成 (86MB 程度) のリポジトリであれば、①〜③のステップは**約3分**で完了します。これは、Codespaces の最小構成である 2-core (8GB RAM) での計測結果です[^1]。8-core (32GB RAM) にすると、約1分半で構築が完了します。もし起動時間が長い場合は、以下のような対策を検討してみてください。

- GitHub Codespaces のマシンタイプを変更
- Dev Container の見直し
  - カスタムイメージを使用
  - 拡張機能の取捨選択
:::

[^1]: 次回以降の起動はさらに短時間で完了します。

## AWS CLI の実行

①〜③のステップ完了後、AWS CLI を利用できます。試しに、以下コマンドを実行してみましょう。`AWSReservedSSO_` で始まる許可セットの IAM ロールを引き受けできていることが、確認できます。

```bash: IAM ロールの引き受け確認
$ aws sts get-caller-identity --profile CdkDeployment
{
  "UserId": "AROAxxxx:yusei.matsuo@example.com",
  "Account": "111122223333",
  "Arn": "arn:aws:sts::111122223333:assumed-role/AWSReservedSSO_CdkDeployment_1a12345b12c123d1/yusei.matsuo@example.com"
}
```

補足として、私の所属するチームでは IaC ツールに AWS CDK を採用しています。上記の方法で AWS CDK CLI による diff やデプロイも迅速に実行できるため、非常に便利です。新しく参加したメンバーも開発環境を素早く構築できるため、オンボーディングにも効果的です。

# 設定手順

ここからは、上記構成の設定手順を説明します。

1. [AWS IAM Identity Center 許可セットの作成](#1-aws-iam-identity-center-許可セットの作成)
2. [AWS IAM Identity Center アクセスの割り当て](#2-aws-iam-identity-center-アクセスの割り当て)
3. [Dev Container の設定](#3-dev-container-の設定)

## 前提条件

- AWS IAM Identity Center の組織インスタンスが有効化[^2]
- GitHub Enterprise Cloud でリポジトリを作成済[^3]
- Microsoft Entra ID 関連の SAML 連携を設定済[^4][^5]

[^2]: [AWS IAM Identity Center の有効化 - AWS IAM Identity Center](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/get-set-up-for-idc.html)

[^3]: [新しいリポジトリの作成 - GitHub Enterprise Cloud Docs](https://docs.github.com/ja/enterprise-cloud@latest/repositories/creating-and-managing-repositories/creating-a-new-repository): リポジトリ作成後、`cdk init app --language typescript` など任意のプロジェクトを作成してください。本記事の設定手順では、npm プロジェクトを想定した処理になっています。

[^4]: [Microsoft Entra ID と IAM Identity Center を使用して SAML と SCIM を構成する - AWS IAM Identity Center](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/idp-microsoft-entra.html)

[^5]: [チュートリアル: Microsoft Entra SSO と GitHub Enterprise Cloud - Enterprise アカウントの統合 - Microsoft Entra ID | Microsoft Learn](https://learn.microsoft.com/ja-jp/entra/identity/saas-apps/github-enterprise-cloud-enterprise-account-tutorial)


## 1. AWS IAM Identity Center 許可セットの作成

管理アカウントの AWS IAM Identity Center で、必要なアクセス権限を持つ許可セットを作成します。例えば、AWS CDK 実行用に許可セットを作成したい場合、以下のようなインラインポリシーを指定します[^6]。

[^6]: 記載例のポリシーは[Security And Safety Dev Guide · aws/aws-cdk Wiki](https://github.com/aws/aws-cdk/wiki/Security-And-Safety-Dev-Guide)を引用しています。

```json: 許可セットのインラインポリシー例
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "AssumeCDKRoles",
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "*",
    "Condition": {
      "StringEquals": {
        "iam:ResourceTag/aws-cdk:bootstrap-role": [
          "image-publishing",
          "file-publishing",
          "deploy",
          "lookup"
        ]
      }
    }
  }]
}
```

![許可セット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/37dbc127-aa08-afdf-9492-2470b7dd2c7a.png)

参考手順：[Create a permission set - AWS IAM Identity Center](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/howtocreatepermissionset.html)

## 2. AWS IAM Identity Center アクセスの割り当て

AWS IAM Identity Center のユーザー・グループ[^7]に対して、アクセスを割り当てます。アクセス先の AWS アカウントに対して、ユーザー・グループ＆先ほど作成した許可セットを指定します。

![アクセスの割り当て](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989026/ae2a4636-4040-ab14-5929-ae8ebb1f7a51.png)

開発用途での割り当ては、グループの方が便利です。新しいメンバーが参加した際に、Microsoft Entra ID からグループに追加するだけでアクセス権限が付与されるためです。

参考手順：[Assign user access to AWS accounts - AWS IAM Identity Center](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/assignusers.html)

[^7]: 構成図における AWS IAM Identity Center のユーザー・グループは、外部 ID プロバイダーの「Microsoft Entra ID」から同期されています。

## 3. Dev Container の設定

GitHub のリポジトリで `.devcontainer/devcontainer.json` を作成します。`extensions` には、チームで共通に利用する拡張機能を指定します。

```jsonc: .devcontainer/devcontainer.json
{
  // 用途に応じてイメージを変更
  "image": "mcr.microsoft.com/devcontainers/typescript-node",
  "features": {
    // AWS CLI のインストール
    "ghcr.io/devcontainers/features/aws-cli:1": {}
  },
  // 起動後に実行するコマンドを指定
  "postCreateCommand": "sh .devcontainer/initialize.sh",
  // VSCode の拡張機能などを定義（以下はサンプル）
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode",
        "GitHub.copilot",
        "GitHub.copilot-chat",
        "ms-azuretools.vscode-docker",
        "ms-vscode.vscode-typescript-next",
        "amazonwebservices.aws-toolkit-vscode"
      ]
    }
  }
}
```

上記の `postCreateCommand` では、AWS CLI のプロファイル設定に関するスクリプトを実行します。ここで設定するプロファイルは、GitHub Codespaces で AWS SSO ログインするときに利用します[^8]。

[^8]: `initialize.sh` で任意ツールのインストールコマンドを追加すれば、Codespaces 起動後に自動でインストールされます。

`.devcontainer/initialize.sh` を作成し、以下のスクリプトを記述します。

```sh: .devcontainer/initialize.sh
#!/bin/bash

mkdir -p ~/.aws

# 許可セットなど、アクセス割り当てに準じたプロファイルを作成
cat <<EOL > ~/.aws/config
[default]
region=ap-northeast-1
output=json

[profile CdkDeployment]
sso_start_url = https://{IdentityStoreID}.awsapps.com/start#/
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access
sso_account_id = 111122223333
sso_role_name = CdkDeployment

[profile Viewer]
sso_start_url = https://{IdentityStoreID}.awsapps.com/start#/
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access
sso_account_id = 444455556666
sso_role_name = Viewer
EOL

echo "AWS config file created successfully at ~/.aws/config"
npm install
```

複数のプロファイルを設定することで、アクセス権限を柔軟に使い分けることができます。例えば、開発・ステージング・本番環境の AWS アカウントごとに異なる権限を設定できます。上記の設定例では、以下のような使い分けを想定しています。

- `CdkDeployment` プロファイル：AWS CDK のデプロイに必要な権限を持つロール
- `Viewer` プロファイル：AWS リソースの参照のみが可能なロール

:::note
これらのプロファイルがプライベートリポジトリに含まれることは問題ありません。なぜなら、**IAM Identity Center で認可設定を一元管理**しているからです。IAM Identity Center でアクセス割り当てされていないユーザーは、プロファイルを使用しても AWS リソースにアクセスできません。
:::

最後に、上記2つのファイルをリポジトリにコミット・プッシュします。[前述の通り](#-codespaces-起動)、GitHub Codespaces を起動すると自動的に Dev Container で `initialize.sh` が実行されます。

# おわりに

AWS IAM Identity Center と Dev Container を組み合わせることで、開発環境の構築を劇的に簡素化できます。開発者はリポジトリから Codespaces を起動して数分後に、AWS リソースへアクセスできるようになります。また、クレデンシャルのセットアップが不要なため、セキュリティの向上にも寄与します。

本記事がどなたかのお役になれば幸いです。

# 参考資料

- [IAM Identity Center とは何ですか? - AWS IAM Identity Center](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/what-is.html)
- [AWS CLI を使用した IAM アイデンティティセンター認証の設定 - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sso.html)
- [GitHub Codespaces の概要 - GitHub Docs](https://docs.github.com/ja/codespaces/overview)
- [Developing inside a Container using Visual Studio Code Remote Development](https://code.visualstudio.com/docs/devcontainers/containers)
- [Microsoft Artifact Registry](https://mcr.microsoft.com/)