AWS マルチアカウント運用 (dev / prod) と IAM 初期設定

設計書ができたら、まず AWS アカウントの構造を決める必要があります。本記事では dev / prod の 2 アカウント分離 と、Terraform を回す前提となる IAM ユーザの初期設定 について書きます。

なぜマルチアカウントなのか

個人開発でも、AWS を 2 アカウント以上に分けるメリットは大きいです:

個人で 1 アカウントで全部やってる人が多いので、ここで差が付きます。

本シリーズで使うアカウント構成

用途アカウント主な内容
検証・実験aws-devautoST など試験中のもの。本シリーズの構築は当初こちらで開始
本番運用aws-prod公開サイト lab.iigtn.com の本番リソース

本シリーズの本番リソースは すべて aws-prod に置き、dev には触れない方針にしました。

初期に dev で bootstrap した経緯: 最初の terraform/bootstrap/setup.sh 実行時、AWS CLI のデフォルトプロファイルが dev に向いていることに気付かず、間違って dev に state バケットを作ってしまいました。すぐ削除して prod 側で作り直し。「実行前に必ず aws sts get-caller-identity で確認」 がそこからの教訓です。

AWS アカウントの初期セキュリティ設定

新規 AWS アカウントを作ったら、最初に必ずやることが 4 つあります:

  1. ルートユーザーに MFA: Authenticator アプリで 2 段階認証を設定
  2. 請求情報の表示権限を IAM ユーザーに付与: Billing Console を見られるようにする
  3. AWS Budgets で月額予算アラート: 想定外コスト発生の早期検知
  4. CloudTrail を有効化: 操作ログを残す(無料枠あり)

これらをやらないままアクセスキーが流出すると、暗号通貨マイニング等で 1 晩で 100 万円超え の請求が来る事故が定期的に話題になります。

IAM ユーザーの作成

AWS の操作は ルートユーザーで直接やらない のが原則です。代わりに IAM ユーザーを作って、そちらで操作します。

本シリーズでは、各アカウントに 1 つずつ IAM ユーザーを作りました:

アカウントIAM ユーザー名権限
aws-devadmin-devAdministratorAccess(暫定)
aws-prodadmin-prodAdministratorAccess(暫定)
最初は AdministratorAccess を付けて構築を進め、後で IAM Access Analyzer で実際に使った API を可視化して権限を絞っていく、という流れが現実的です。最初から最小権限にすると毎回 AccessDenied でハマって作業が進みません。

IAM ユーザー作成画面で迷うポイント

AWS コンソールの IAM ユーザー作成画面で、初心者が必ず迷うのが「ユースケース」のところです。本シリーズでは:

項目選択
ユーザー名admin-prod
マネジメントコンソールへのアクセスOFF(CLI / Terraform 専用にする)
許可「ポリシーを直接アタッチする」 → AdministratorAccess
アクセスキー作成時のユースケース「コマンドラインインターフェイス (CLI)」

コンソールアクセスを OFF にする理由は、「人間用とプログラム用は分ける」 が原則だからです。コンソールに入るときはルート + MFA か、別途コンソール専用ユーザーを作る方が安全。

アクセスキーの危険性

IAM ユーザーのアクセスキー(Access Key ID + Secret)は、「永続的な権限の持ち運び可能なコピー」 です。これが最も漏洩リスクが高い:

本シリーズでは 「アクセスキーを使うのは bootstrap の初回だけ」 と決めました。Terraform 構築後は GitHub Actions OIDC に移行し、アクセスキーをほぼゼロに近づけます(記事 #12 で扱います)。

ローカルでの認証設定

アクセスキーが取れたら、aws configure --profile でローカルにプロファイルを設定します:

# prod 用プロファイル
aws configure --profile aws-prod

# 聞かれる項目
AWS Access Key ID [None]:     AKIA...(コピペ)
AWS Secret Access Key [None]: ...(コピペ)
Default region name [None]:   ap-northeast-1
Default output format [None]: json

# dev 用も同じ要領で
aws configure --profile aws-dev

これで ~/.aws/credentials~/.aws/config に保存されます。Windows なら C:\Users\<ユーザー>\.aws\ 配下です。

使い分けるときの落とし穴

AWS CLI でプロファイルを切り替えるときは、必ず確認してから操作します:

# ① 切替
export AWS_PROFILE=aws-prod
# Windows PowerShell なら: $env:AWS_PROFILE = 'aws-prod'

# ② 確認 (これを必ずやる)
aws sts get-caller-identity

# 期待される出力
{
  "UserId": "AIDA...",
  "Account": "XXXXXXXXXXXX",
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/admin-prod"
}

# ③ 確認後に操作
aws s3 ls
これを習慣にしないと、確実に「dev のつもりで prod を消した」事故を起こします。私自身、初回 bootstrap でこれをサボって dev に state を作る事故を起こしました。

2 アカウント運用での共通ファイル

2 つの AWS アカウントを切り替える前提なので、ローカルの設定ファイルは次のようになります:

# ~/.aws/credentials
[aws-dev]
aws_access_key_id = AKIA-DEV-XXXXX
aws_secret_access_key = ...

[aws-prod]
aws_access_key_id = AKIA-PROD-XXXXX
aws_secret_access_key = ...

# ~/.aws/config
[profile aws-dev]
region = ap-northeast-1
output = json

[profile aws-prod]
region = ap-northeast-1
output = json

この時点で default プロファイル は意図的に作りません。「明示しないと操作できない」状態にすることで、誤操作を構造的に防ぎます。

請求アラートの初期設定

IAM ユーザー作成と並行して、必ず Budgets アラートを入れておきます。本シリーズでは Terraform で後から作りますが、初期検証中は手動で設定するのも有効です。

閾値意味
$1 (約 150 円)「あれ、何か始まった?」レベル
$10 (約 1,500 円)「想定外の何かが回り始めた」レベル
$50 (約 7,500 円)「危険、即対応」レベル

個人ポートフォリオなら $10 / 月で十分。それを超えたらメール通知が飛ぶように設定しておくと安心です。

次の記事

AWS アカウントの準備ができたら、次はローカル開発環境を整えます。次の記事では PowerShell / Git Bash / AWS CLI / Terraform / gh CLI のセットアップについて書きます。Windows 環境固有のハマりどころも紹介します。

📚 用語集

マルチアカウント運用
1 つの組織で複数の AWS アカウントを使い分ける運用方式。ワークロード隔離・権限分離・コスト可視化のメリットがある。
ルートユーザー
AWS アカウント作成時のメールアドレスでログインする最高権限ユーザー。日常操作には絶対に使わず、IAM ユーザーを作って使う。
MFA (Multi-Factor Authentication)
多要素認証。パスワード + Authenticator アプリの 6 桁コード等。ルートユーザーには必須。
IAM (Identity and Access Management)
AWS のアクセス権管理サービス。ユーザー・ロール・ポリシーで「誰が何をできるか」を定義。
IAM ユーザー
人間に紐付く永続的な識別子。アクセスキー(プログラム用)とコンソール認証情報(人間用)を持てる。
IAM ロール
「役割」を表す概念。誰でも適切に AssumeRole できれば一時的にその役割になれる。永続的な認証情報を持たない。
AdministratorAccess
AWS が標準で提供する IAM ポリシーで、ほぼ全 API を許可する強い権限。初期構築時に使うが、運用フェーズでは Access Analyzer で絞り込む。
アクセスキー (Access Key)
Access Key ID + Secret Access Key のペア。プログラムから AWS API を叩くときの認証情報。永続的なので漏洩リスクが高い。
AWS CLI
AWS をコマンドラインから操作するツール。aws コマンドで提供される。
profile (プロファイル)
AWS CLI で複数のアカウント / 認証情報を切り替える仕組み。aws --profile aws-prod ... や環境変数 AWS_PROFILE で指定。
aws sts get-caller-identity
「今自分が誰として AWS に対して操作しようとしているか」を返す API。プロファイル切替後に必ず叩く確認コマンド。
AWS Budgets
月額予算とアラート閾値を設定する AWS 標準サービス。50% / 80% / 100% で通知を送るのが定番設定。
CloudTrail
AWS 上の API コール履歴を記録するサービス。「誰が何時に何をしたか」が追跡できる。一定期間まで無料。
IAM Access Analyzer
実際に使われた API を分析し、最小権限の IAM ポリシーを自動生成するツール。運用後の権限絞り込みに使う。
OIDC (OpenID Connect)
本シリーズで GitHub Actions と AWS の連携に使う認証プロトコル。アクセスキーなしで一時クレデンシャルを取得できる。記事 #12 で詳説。