Tech Blog

AWS CDK + PowerShell + SSO で誤リージョンにデプロイした話と後始末

AWS CDK CloudFormation PowerShell

はじめに

「デプロイできた!」と思ったら、東京リージョンではなくバージニア北部(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

まとめ

この失敗から学んだ教訓:

  1. CDK の env はハードコードで明示する — 環境変数・デフォルト設定に頼らない
  2. cdk synth でリージョンを確認してからデプロイ — manifestのリージョン確認が最後の砦
  3. PowerShell の $env:AWS_DEFAULT_REGION が残っていないか確認する — 前の作業の残留物に注意
  4. 誤デプロイしたらその場で cleanup まで終える — 翌日まで持ち越すと更に複雑になる

Windows + AWS SSO + CDK という組み合わせはハマりやすいポイントが多いですが、
cdk synth のmanifest確認を習慣化するだけで大半の誤デプロイは防げます。


このシリーズの記事マップ

dvdrental 管理アプリと対になるエンドユーザー向けDVDレンタルアプリを作っている話 — Vue 3 + Spring Boot の全体構成と記事マップ
PostgreSQL のサンプル DB dvdrental をベースに Spring Boot + Thymeleaf で DVD レンタル管理アプリを作った話

気軽にメッセージください

技術相談・ご感想・ご質問があればメッセージをお願いします。