AWS Organizationsからのアカウント作成手順
AWS Organizations を使用して新しいAWSアカウントを作成し、セキュリティサービスの初期設定を完了するまでの手順。
前提条件
- マネジメントアカウント(703480710002)の特権 IAM ユーザー
mz-fastdoctor-adminを使えること(下記参照) - 踏み台アカウント(770217130318)の IAM ユーザーを持っていること
- アカウント一覧は AWSアカウント管理スプレッドシート を参照
マネジメントアカウントへのログイン
マネジメントアカウントの root ユーザーは Megazone(代理店)が管理しており、自社では使用しない。 自社では Megazone が払い出した特権 IAM ユーザー mz-fastdoctor-admin を使う。 MFA は GCP Secret Manager のシードから oathtool で OTP を生成する(初回セットアップは /root-access-setup スキルを参照)。
CLI(推奨)
AWS CLI v2 の aws login により、マネコンのログインセッションから一時クレデンシャルを取得できる。 アクセスキーの発行は不要。
# ~/.aws/config
[profile management]
login_session = arn:aws:iam::703480710002:user/mz-fastdoctor-admin
region = ap-northeast-1aws login --profile managementブラウザが開くので mz-fastdoctor-admin でログインする。MFA コードは以下で生成する。
oathtool --totp -b $(gcloud secrets versions access latest --secret=mz-fastdoctor-admin-mfa --project=fd-secrets-management)aws sts get-caller-identity --profile managementNote:
aws loginはブラウザのコンソールセッションに紐づくため、踏み台(default)と同時に保持できない。aws login --profile managementを実行すると踏み台側のセッションが無効化され、 しばらくすると踏み台経由の全プロファイルがCreateOAuth2Tokenエラーになる。 マネジメントアカウントでの作業中は踏み台へのアクセスを行わない、もしくは別ブラウザプロファイルを使うこと。Note: マネジメントアカウントでの作業は最小限にとどめる方針のため、作業完了後は
aws logout --profile managementを実行すること。 アカウント作成以降の作業は踏み台からの SwitchRole で完結する。
全体の流れ
Step 1: アカウント作成・OU配置
→ SCP / CloudTrail / GuardDuty が自動適用される
Step 2: 初期構築(bootstrap)
→ OrganizationAccountAccessRole 経由でCLIプロファイル設定、S3バケット(tfstate/tfvars)
※ root資格情報は存在しないため、rootログインは不要かつ不可
Step 3: Terraform apply
→ SwitchRoleロール、Configサービスリンクロール、S3パブリックアクセスブロック、予算アラート
Step 4: 追加のセキュリティ設定(別途対応)
→ Security Hub、Inspector、IAM Access AnalyzerStep 1: アカウント作成・OU配置
1-1. OU配置先の決定
| OU | 用途 | 適用されるSCP |
|---|---|---|
| Production | 本番環境 | リージョン制限、セキュリティサービス保護、本番データ保護、S3パブリックアクセス禁止 |
| Non-Production | 開発・ステージング・PoC | リージョン制限、セキュリティサービス保護、S3パブリックアクセス禁止 |
| Sandbox | インフラ検証・SCPテスト | リージョン制限、セキュリティサービス保護、S3パブリックアクセス禁止 |
| Infrastructure | 踏み台・共通基盤 | リージョン制限、セキュリティサービス保護 |
| Security | セキュリティツール・ログ集約 | セキュリティサービス保護のみ(リージョン制限なし) |
新規アカウントは最初から正しいOUに配置してよい(SCPの詳細は末尾の注意事項を参照)。
詳細: OU・アカウント設計書 / SCP設計書
1-2. アカウントの作成
マネジメントアカウント (703480710002) で実行する(CLI は --profile management)。
root メールアドレスは fdt-sre+<サービス名>.prd@fastdoctor.jp / .stg@ の形式とする(SREメーリングリストのエイリアス)。 root メールアドレスの変更には root ログインが必要で実質変更できないため、作成時に確定させること。
コンソール
- AWS Organizations → AWSアカウント → 「AWSアカウントを追加」
- 以下を入力して作成:
| 項目 | 説明 | 入力例 |
|---|---|---|
| AWSアカウント名 | アカウントの識別名 | fastdoctor-service-prod |
| アカウント所有者のEメールアドレス | アカウントのルートユーザーメールアドレス(一意である必要あり) | fdt-sre+service.prd@fastdoctor.jp |
| IAMロール名 | クロスアカウントアクセス用ロール(デフォルト推奨) | OrganizationAccountAccessRole |
CLI
aws organizations create-account \
--email "fdt-sre+<サービス名>.prd@fastdoctor.jp" \
--account-name "<アカウント名>" \
--role-name "OrganizationAccountAccessRole" \
--iam-user-access-to-billing ALLOW \
--profile management
# 作成状況の確認(State が SUCCEEDED になると AccountId が返る)
aws organizations describe-create-account-status \
--create-account-request-id <request-id> \
--profile managementNote:
--role-name OrganizationAccountAccessRoleは省略不可。root が使えないため、 このロールが新規アカウントへの唯一の入口になる。
1-3. OUへの配置
作成直後はRoot直下に配置される。決定したOUに移動する。
コンソール
- AWS Organizations → AWSアカウント → 対象アカウントにチェック
- アクション → 移動
- 移動先OUを選択して移動
CLI
aws organizations move-account \
--account-id <新アカウントID> \
--source-parent-id r-8z8v \
--destination-parent-id <移動先OU ID> \
--profile management| OU | ID |
|---|---|
| Root | r-8z8v |
| Workloads | ou-8z8v-8hqkx7rw |
| └ Production | ou-8z8v-y8njbvhn |
| └ Non-Production | ou-8z8v-f8sxxvff |
| Infrastructure | ou-8z8v-2v5zpg7b |
| Security | ou-8z8v-dq0iuf8o |
| Sandbox | ou-8z8v-ver6s0o1 |
| Suspended | ou-8z8v-0z0n8szg |
# 配置確認
aws organizations list-accounts-for-parent --parent-id <移動先OU ID> \
--query "Accounts[].[Name,Id]" --output text --profile managementOU配置により CloudTrail(組織トレイル)、GuardDuty、SCP、Config Aggregator が自動適用される。
Step 2: 初期構築(bootstrap)
重要: 中央集中型 root アクセス管理の有効化により、新規作成されたアカウントには root 資格情報が存在しない。 root でのログイン・パスワード設定・MFA 設定はいずれも不可であり、また不要。 詳細は root アクセス管理 設計書 / 運用手順書 を参照。
代わりに、アカウント作成時に自動生成される
OrganizationAccountAccessRoleを マネジメントアカウントから AssumeRole して初期構築を行う。
2-1. bootstrap 用 CLI プロファイルの設定
# ~/.aws/config
[profile <アカウント名>-bootstrap]
role_arn = arn:aws:iam::<新アカウントID>:role/OrganizationAccountAccessRole
source_profile = management
region = ap-northeast-1
# Terraform 実行用(TerraformのAWS SDKは login_session 形式を直接扱えないため)
[profile <アカウント名>-bootstrap-terraform]
credential_process = aws configure export-credentials --profile <アカウント名>-bootstrapmanagement プロファイルの設定は マネジメントアカウントへのログイン を参照。
# 動作確認
aws sts get-caller-identity --profile <アカウント名>-bootstrapNote:
CreateOAuth2TokenのThe provided authorization grant is invalid, expired, revoked, or malformedが出た場合は、source_profile側のログインセッションが切れている。aws login --profile <source_profile>を実行する。
aws login --profile managementを実行すると、踏み台(default)側のセッションが無効化される。 手元のキャッシュが切れるまでは既存プロファイルが動くため気付きにくいが、しばらくすると 踏み台経由の全プロファイルが上記エラーになる。マネジメントアカウントでの作業を終えたらaws logout --profile managementし、aws login --profile defaultで踏み台に入り直すこと。
2-2. IAM ロールについて
手動で作成するロールはない。 Terraform 実行に必要な権限は上記 OrganizationAccountAccessRole で賄い、 恒常的に使う administrator-role / read-only-role は Step 3 の terraform apply で作成される(role.tf)。
| ロール | 作成主体 | 信頼元 | 用途 |
|---|---|---|---|
OrganizationAccountAccessRole | アカウント作成時に自動 | マネジメントアカウント | 初回 apply までの bootstrap 専用 |
administrator-role | Terraform role.tf | 踏み台 770217130318 | マネコン SwitchRole・Terraform 実行 |
read-only-role | Terraform role.tf | 踏み台 770217130318 | 参照用 SwitchRole |
Note:
administrator-roleにはdeny-iamポリシー(IAM ユーザー操作のみ Deny)が付くが、 IAM ロール・ポリシーは作成できるため Terraform の実行に支障はない。 Terraform 専用の別ロール(旧手順のterraform-role)はadministrator-roleと信頼ポリシーが同一で 権限がより広いだけのため、作成しない。
2-3. S3バケット(tfstate / tfvars)
<アカウント名>-bootstrap プロファイルで作成する。 設定内容(Terraform運用設計書に準拠): バージョニング有効、SSE-S3暗号化、パブリックアクセス完全ブロック、非現行バージョンを90日で削除。
PROFILE=<アカウント名>-bootstrap
for BUCKET in fd-tfstate-<アカウント名> fd-tfvars-<アカウント名>; do
aws s3 mb s3://${BUCKET} --region ap-northeast-1 --profile ${PROFILE}
aws s3api put-bucket-versioning \
--bucket ${BUCKET} \
--versioning-configuration Status=Enabled \
--profile ${PROFILE}
aws s3api put-bucket-encryption \
--bucket ${BUCKET} \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}' \
--profile ${PROFILE}
aws s3api put-public-access-block \
--bucket ${BUCKET} \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true \
--profile ${PROFILE}
aws s3api put-bucket-lifecycle-configuration \
--bucket ${BUCKET} \
--lifecycle-configuration \
'{"Rules":[{"ID":"DeleteOldVersions","Status":"Enabled","Filter":{},"NoncurrentVersionExpiration":{"NoncurrentDays":90}}]}' \
--profile ${PROFILE}
doneStep 3: Terraform apply
3-1. Terraformディレクトリの作成
fastdoctor-template/common/ 配下に新しいアカウント用のディレクトリを作成する。 既存のシンプルなアカウント(cc-poc等)をテンプレートとしてコピーし、以下を修正:
| ファイル | 変更箇所 |
|---|---|
backend.tf | S3バケット名 |
variable.tf | project, env |
download-tfvar.sh / upload-tfvar.sh | S3バケット名 |
初回の apply は <アカウント名>-bootstrap-terraform プロファイルで実行する (administrator-role はこの apply で作られるため、まだ存在しない)。
AWS_PROFILE=<アカウント名>-bootstrap-terraform terraform init
AWS_PROFILE=<アカウント名>-bootstrap-terraform terraform planapply の前に、Config のサービスリンクロールを import する。 OU 配置に伴い AWSServiceRoleForConfig が自動生成済みのため、import しないと Service role name AWSServiceRoleForConfig has been taken in this account で apply が失敗する。
AWS_PROFILE=<アカウント名>-bootstrap-terraform terraform import \
aws_iam_service_linked_role.config \
arn:aws:iam::<新アカウントID>:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfigAWS_PROFILE=<アカウント名>-bootstrap-terraform terraform applyapply 完了後、以降の運用用プロファイルを追加して切り替える。 OrganizationAccountAccessRole を使うのはここまで。
# ~/.aws/config
[profile <アカウント名>]
role_arn = arn:aws:iam::<新アカウントID>:role/administrator-role
source_profile = default
region = ap-northeast-1
[profile <アカウント名>-terraform]
credential_process = aws configure export-credentials --profile <アカウント名>
[profile <アカウント名>-readonly]
role_arn = arn:aws:iam::<新アカウントID>:role/read-only-role
source_profile = default
region = ap-northeast-13-2. Terraform apply で作成されるリソース
terraform init → terraform plan → terraform apply で以下が一括作成される:
| リソース | ファイル | 内容 |
|---|---|---|
| SwitchRoleロール | role.tf | read-only-role, administrator-role(踏み台からAssumeRole) |
| IAMポリシー | policy.tf | deny-iam(IAMユーザー操作の制限) |
| Config のサービスリンクロール | config.tf | AWSServiceRoleForConfig。Security Hub の Service-Linked Recorder が参照する |
| S3 Account Public Access Block | main.tf | アカウントレベルのパブリックアクセスブロック |
| 予算アラート | main.tf | 月額上限、閾値超過でメール通知 |
3-3. apply後の確認
# drift がないか
AWS_PROFILE=<アカウント名>-terraform terraform plan
# → No changes. Your infrastructure matches the configuration.
# SwitchRole が機能するか(踏み台から)
aws sts get-caller-identity --profile <アカウント名>
aws sts get-caller-identity --profile <アカウント名>-readonly
# S3 Account Public Access Block
aws s3control get-public-access-block --account-id <新アカウントID> --profile <アカウント名>
# 予算アラート
aws budgets describe-budgets --account-id <新アカウントID> \
--query "Budgets[].[BudgetName,BudgetLimit.Amount]" --output text --profile <アカウント名>Note: Config Recorder(CMR)は Security Hub V2 の有効化に伴い廃止済み。 評価は Service-Linked Recorder がカバーするため、
describe-configuration-recorder-statusは空で正常。 詳細は Config組織統合設計書 を参照。
注意: S3 Account Public Access Block は SCP(
deny-s3-account-public-access-block)により、一度設定すると解除不可。 予算アラートの通知先にAWS Budgetsから確認メールが届くので承認が必要。
Step 4: 追加のセキュリティ設定(今後のタスク)
以下は組織統合の整備状況により、別途対応が必要(2026-08時点)。
| サービス | 状態 | 対応方針 |
|---|---|---|
| Security Hub | Configuration PolicyがRoot未適用 | security-tooling で association追加 or Root適用 |
| Inspector | 組織委任未実施 | per-account で template_modules/options/inspector モジュール使用 |
| IAM Access Analyzer | per-account | platform モジュール or 個別に aws_accessanalyzer_analyzer 作成 |
| Macie | コスト対効果により保留中 | 設定不要 |
チェックリスト
□ Step 1: アカウント作成・OU配置
□ アカウント作成完了(ステータス: アクティブ)
□ 適切なOUに配置済み
□ 自動適用の確認(CloudTrail、GuardDuty)
□ Step 2: 初期構築(bootstrap)
□ root資格情報が存在しないことを確認(IAM → ルートアクセス管理 → 「存在しない」)
□ <アカウント名>-bootstrap / -bootstrap-terraform プロファイル設定
□ AssumeRole動作確認(aws sts get-caller-identity)
□ S3バケット作成(tfstate, tfvars — バージョニング/暗号化/パブリックアクセスブロック/ライフサイクル)
□ Step 3: Terraform apply
□ ディレクトリ作成(common/<アカウント名>/)
□ Config のサービスリンクロールを import
□ 初回 terraform init / apply 完了(-bootstrap-terraform プロファイル)
□ 運用用プロファイル(administrator-role / read-only-role)へ切り替え・動作確認
□ terraform plan: No changes(drift なし)
□ SwitchRoleロール: 動作確認
□ S3 Account Public Access Block: 設定済み
□ 予算アラート: 設定済み・メール承認済み
□ Step 4: 追加のセキュリティ設定
□ Security Hub: Configuration Policy適用済み
□ Inspector: 有効化済み
□ IAM Access Analyzer: 作成済み
□ 管理台帳の更新
□ AWSアカウント管理スプレッドシート更新
□ OU・アカウント設計書のアカウント一覧更新SCPに関する注意事項
セキュリティサービス保護SCP
deny-disable-security-services(Root全体に適用)により、以下の操作が全プリンシパルに対して無条件でブロックされる:
| 対象サービス | ブロックされる操作 |
|---|---|
| CloudTrail | StopLogging, DeleteTrail |
| Config | StopConfigurationRecorder, DeleteConfigurationRecorder, DeleteDeliveryChannel |
| GuardDuty | DeleteDetector, DisassociateFromAdministratorAccount |
| Security Hub | DisableSecurityHub, DisassociateFromAdministratorAccount |
| Inspector | Disable |
| Access Analyzer | DeleteAnalyzer |
| Macie | DisableMacie |
| IAM(ルートユーザー) | CreateAccessKey, UpdateAccessKey |
ロールベースの例外条件はない。 Config Recorderの削除・再作成が必要な場合は、SCPを一時変更する必要がある。 変更はSandbox OU(infra-dev)で事前検証してから本番OUに適用すること。
リージョン制限SCP
許可リージョン: ap-northeast-1, us-east-1, us-west-2, ap-northeast-3
IAM, Organizations, STS, CloudFront, Route53, WAF (Global), Config, GuardDuty, Security Hub, KMS, S3 (一部), Bedrock 等は NotAction で除外されており、リージョン制限の影響を受けない。