AWS CDK + PowerShell + SSO で誤リージョンにデプロイした話と後始末
はじめに
「デプロイできた!」と思ったら、東京リージョンではなくバージニア北部(us-east-1)にスタックが作られていました。
AWS CDK + Windows PowerShell + AWS SSO という組み合わせで起きた失敗と、その後始末の記録です。
構成
- OS: Windows 11
- シェル: PowerShell 5.1
- AWS 認証: AWS SSO(IAM Identity Center)
- CDK バージョン: 2.x
- ターゲットリージョン: ap-northeast-1(東京)
何が起きたか
# CDK デプロイ実行
cdk deploy --profile myproject-dev
しばらくして確認すると、CloudFormation スタックが東京ではなく us-east-1 に作られていました。
原因の調査
原因1:CDK の env 設定が不十分だった
// cdk/lib/app-stack.ts
const app = new cdk.App();
new AppStack(app, 'DvdRentalStack', {
// env を指定していなかった
});
CDK は env が未指定の場合、デプロイ時の環境変数やデフォルト設定からリージョンを解決します。
// 正しい書き方
new AppStack(app, 'DvdRentalStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: 'ap-northeast-1', // 明示的に指定
}
});
原因2:PowerShell の AWS 環境変数が残っていた
以前の作業で us-east-1 を設定した環境変数が残っていました。
# 残っていた環境変数
$env:AWS_DEFAULT_REGION # = "us-east-1"
CDK はプロファイルの設定より環境変数を優先するため、プロファイルで東京を設定していても us-east-1 に向いてしまいました。
原因3:cdk synth で確認しなかった
# デプロイ前に必ず実行すべきだった
cdk synth --profile myproject-dev
cdk synth の出力に ap-northeast-1 が含まれているかを確認すれば、デプロイ前に気づけました。
後始末
誤リージョンのスタックを削除し、正しいリージョンに作り直す作業が必要になりました。
ステップ1:誤リージョンのスタック確認
# us-east-1 のスタック確認
aws cloudformation describe-stacks `
--region us-east-1 `
--profile myproject-dev `
--query "Stacks[?StackName=='DvdRentalStack'].{Name:StackName,Status:StackStatus}"
ステップ2:誤リージョンのスタック削除
aws cloudformation delete-stack `
--stack-name DvdRentalStack `
--region us-east-1 `
--profile myproject-dev
削除の完了を待つ:
aws cloudformation wait stack-delete-complete `
--stack-name DvdRentalStack `
--region us-east-1 `
--profile myproject-dev
ステップ3:正しいリージョンへデプロイ
環境変数をクリアして、明示的に東京リージョンを設定:
# 誤った環境変数をクリア
Remove-Item Env:AWS_DEFAULT_REGION -ErrorAction SilentlyContinue
Remove-Item Env:AWS_REGION -ErrorAction SilentlyContinue
# デプロイ前に synth でリージョンを確認
cdk synth --profile myproject-dev | Select-String "ap-northeast-1"
# 確認できたらデプロイ
cdk deploy --profile myproject-dev
再発防止策
対策1:CDK の env を必ず明示する
new AppStack(app, 'DvdRentalStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: 'ap-northeast-1', // ハードコードで東京固定
}
});
対策2:cdk synth を必ず実行してからデプロイ
# このフローを必ず守る
cdk synth --profile myproject-dev # ← リージョン確認
cdk diff --profile myproject-dev ← 変更差分確認
cdk deploy --profile myproject-dev # ← デプロイ実行
対策3:PowerShell の SSO 認証情報を明示的にエクスポート
AWS SSO からの一時認証情報を PowerShell 変数としてセットすることで、プロファイル解決の曖昧さをなくします。
# SSO ログイン
aws sso login --profile myproject-dev
# 一時認証情報を取得してエクスポート
$creds = aws sts get-session-token --profile myproject-dev | ConvertFrom-Json
$env:AWS_ACCESS_KEY_ID = $creds.Credentials.AccessKeyId
$env:AWS_SECRET_ACCESS_KEY = $creds.Credentials.SecretAccessKey
$env:AWS_SESSION_TOKEN = $creds.Credentials.SessionToken
$env:AWS_DEFAULT_REGION = "ap-northeast-1"
# これで cdk コマンドがプロファイルではなく環境変数で認証される
cdk deploy
まとめ
この失敗から学んだ教訓:
- CDK の
envはハードコードで明示する — 環境変数・デフォルト設定に頼らない cdk synthでリージョンを確認してからデプロイ — manifestのリージョン確認が最後の砦- PowerShell の
$env:AWS_DEFAULT_REGIONが残っていないか確認する — 前の作業の残留物に注意 - 誤デプロイしたらその場で cleanup まで終える — 翌日まで持ち越すと更に複雑になる
Windows + AWS SSO + CDK という組み合わせはハマりやすいポイントが多いですが、
cdk synth のmanifest確認を習慣化するだけで大半の誤デプロイは防げます。
このシリーズの記事マップ
→ dvdrental 管理アプリと対になるエンドユーザー向けDVDレンタルアプリを作っている話 — Vue 3 + Spring Boot の全体構成と記事マップ
→ PostgreSQL のサンプル DB dvdrental をベースに Spring Boot + Thymeleaf で DVD レンタル管理アプリを作った話