AWS マルチアカウント運用 (dev / prod) と IAM 初期設定
設計書ができたら、まず AWS アカウントの構造を決める必要があります。本記事では dev / prod の 2 アカウント分離 と、Terraform を回す前提となる IAM ユーザの初期設定 について書きます。
なぜマルチアカウントなのか
個人開発でも、AWS を 2 アカウント以上に分けるメリットは大きいです:
- 事故の隔離: dev で
terraform destroyを打ち間違えても prod は無傷 - コストの可視化: 「実験で月 1,000 円、本番で月 200 円」のように分かれて見える
- 権限の物理分離: dev のアクセスキーが流出しても prod は影響受けない
- 採用評価: 「アカウント分離してます」と言えるだけで「分かってる人」判定される
個人で 1 アカウントで全部やってる人が多いので、ここで差が付きます。
本シリーズで使うアカウント構成
| 用途 | アカウント | 主な内容 |
|---|---|---|
| 検証・実験 | aws-dev | autoST など試験中のもの。本シリーズの構築は当初こちらで開始 |
| 本番運用 | aws-prod | 公開サイト lab.iigtn.com の本番リソース |
本シリーズの本番リソースは すべて aws-prod に置き、dev には触れない方針にしました。
terraform/bootstrap/setup.sh 実行時、AWS CLI のデフォルトプロファイルが dev に向いていることに気付かず、間違って dev に state バケットを作ってしまいました。すぐ削除して prod 側で作り直し。「実行前に必ず aws sts get-caller-identity で確認」 がそこからの教訓です。
AWS アカウントの初期セキュリティ設定
新規 AWS アカウントを作ったら、最初に必ずやることが 4 つあります:
- ルートユーザーに MFA: Authenticator アプリで 2 段階認証を設定
- 請求情報の表示権限を IAM ユーザーに付与: Billing Console を見られるようにする
- AWS Budgets で月額予算アラート: 想定外コスト発生の早期検知
- CloudTrail を有効化: 操作ログを残す(無料枠あり)
これらをやらないままアクセスキーが流出すると、暗号通貨マイニング等で 1 晩で 100 万円超え の請求が来る事故が定期的に話題になります。
IAM ユーザーの作成
AWS の操作は ルートユーザーで直接やらない のが原則です。代わりに IAM ユーザーを作って、そちらで操作します。
本シリーズでは、各アカウントに 1 つずつ IAM ユーザーを作りました:
| アカウント | IAM ユーザー名 | 権限 |
|---|---|---|
| aws-dev | admin-dev | AdministratorAccess(暫定) |
| aws-prod | admin-prod | AdministratorAccess(暫定) |
AdministratorAccess を付けて構築を進め、後で IAM Access Analyzer で実際に使った API を可視化して権限を絞っていく、という流れが現実的です。最初から最小権限にすると毎回 AccessDenied でハマって作業が進みません。
IAM ユーザー作成画面で迷うポイント
AWS コンソールの IAM ユーザー作成画面で、初心者が必ず迷うのが「ユースケース」のところです。本シリーズでは:
| 項目 | 選択 |
|---|---|
| ユーザー名 | admin-prod 等 |
| マネジメントコンソールへのアクセス | OFF(CLI / Terraform 専用にする) |
| 許可 | 「ポリシーを直接アタッチする」 → AdministratorAccess |
| アクセスキー作成時のユースケース | 「コマンドラインインターフェイス (CLI)」 |
コンソールアクセスを OFF にする理由は、「人間用とプログラム用は分ける」 が原則だからです。コンソールに入るときはルート + MFA か、別途コンソール専用ユーザーを作る方が安全。
アクセスキーの危険性
IAM ユーザーのアクセスキー(Access Key ID + Secret)は、「永続的な権限の持ち運び可能なコピー」 です。これが最も漏洩リスクが高い:
- GitHub に誤コミット → 数分で発見されてアカウント乗っ取り
- 不要になったあと放置 → 古いキーが流出して悪用される
- 共有 PC に保存 → 退職後も使い続けられる
本シリーズでは 「アクセスキーを使うのは 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
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 で詳説。