はじめに
cdk deployコマンドを実行したところ、タイトル記載のエラーが発生し、コマンド実行に失敗しました。
本記事では、今回の事象と原因、解決策を記載します。
環境情報
実行環境:Mac(Big Sur 11.7.2)
CDK使用言語:TypeScript
cdk-cliのバージョン:2.61.1
事象
cdk deployコマンド実行時に以下のエラーが出ました。
・実行コマンド
cdk deploy --profile user1 --region ap-northeast-1
・エラー内容
Stack Deployments Failed: Error: Need to perform AWS calls for account user1, but the current credentials are for XXXXXXXXXXX
原因
Stackインスタンスに渡す環境情報に不備があったことが原因でした。
CDKでは、Stackインスタンスに以下の環境情報を渡します。
account:AWSアカウントID
region:デプロイ先リージョン
CDKでは、処理のエントリーポイントとなるファイル(binディレクトリにあるファイル)でStackインスタンスを生成します。
そして、生成時のコンストラクタの第3引数(euvプロパティを含むオブジェクト)に環境情報を渡します。
環境情報のaccountでは、デプロイ先のAWSアカウントIDを記載します。
import { BackendStack } from '../lib/backend-stack';
import { App } from 'aws-cdk-lib';
type AccountInfomation = {
account:string,
region:string
};
const app:App = new App();
//Stackインスタンスに渡す環境情報
const accountInformation:AccountInfomation = {
account: "XXXXXXXXXXX", //デプロイ先AWSアカウントIDを記載
region: "ap-northeast-1",
};
//Stackインスタンス生成
new BackendStack(
app,
"KawakitaBackendStack",
{ env: accountInformation }
);
しかし、私はaccountプロパティにAWSアカウントIDではなく、コマンド実行時のprofileオプションで指定したIAMユーザー名を記載していました。
const accountInformation:AccountInfomation = {
account: "user1", //IAMユーザーを記載していた
region: "ap-northeast-1",
};
cdkコマンドでは、profileオプションで指定したIAMユーザーから、そのユーザーが属するAWSアカウントIDを特定し、内部で保持します。
そして、特定したIDと、Stackに渡したaccountプロパティの値が同じか確認するのですが、ここが異なっていた場合、上記のエラーが発生します。
解決策
accountプロパティの値を、IAMユーザー名からAWSアカウントIDに修正しました。
const accountInformation:AccountInfomation = {
- account: "user1",
+ account: "XXXXXXXXXXX", //AWSアカウントIDを記載
region: "ap-northeast-1",
};
最後に
accountプロパティにAWSアカウントIDを渡すのは常識でしょうが、そこが抜けていると今回のようなエラーになることが分かりました。
同様のエラーが発生した時の解決の一助になれば幸いです。