如何解决:“无法解析要使用的AWS帐户。必须在定义CDK时配置或通过环境配置”。

48

我正在尝试运行CDK命令来检查本地和远程堆栈的差异。

我正在使用以下命令。

cdk diff --profile saml

我收到了以下错误信息

Unable to resolve AWS account to use. It must be either configured when you define your CDK or through the environment

我正在寻找解决这个问题的方法。

27个回答

27
~/.aws/config 中删除 [profile default] 对我解决了问题。

2
使用 -v 选项运行 cdk diff 命令会在输出中显示以下内容:“正在解析默认凭证,无法确定默认的 AWS 帐户:TypeError: Cannot redefine property: default”。似乎“default”配置文件名称与 TypeScript 代码中的某些内容冲突,因此重命名/删除“default”配置文件可以使其正常工作。 - sDaub
1
我在那里不知何故有两个同名的配置文件。因此,删除一个修复了错误。 - A Simple Programmer
3
@ASimpleProgrammer 我也遇到过这种情况。通常,同名的两个配置文件是因为执行了两次 aws configure sso 命令。每次执行该命令都会添加一个新条目。 - Kellen Stuart

7

在我的情况下,问题与提出的解决方案无关。
如果你在cdk命令中添加-v(详细)参数,你将会看到实际的错误信息: 无法确定默认的AWS账户:TypeError [ERR_INVALID_PROTOCOL]:不支持协议“https:”,应该是“http:”

我尝试了CDK的不同版本,但都无济于事,依旧出现相同的错误。经过多次尝试后,我找到了根本原因:node.js版本。使用v15.2.1时,我遇到了那个错误,但是将其降级至v14.15.1后,问题得以解决。


5

最后我在 C:\XXXX.aws\credentials 中使用以下内容:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXX

并且输入命令: > cdk deploy --profile default

然而,这个方法没有起作用。

[project1]
aws_access_key_id = ANOTHER_AWS_ACCESS_KEY_ID
aws_secret_access_key = ANOTHER_AWS_SECRET_ACCESS_KEY

同时输入以下命令:> cdk deploy --profile project1

错误:必须通过配置CDK堆栈或通过环境来配置AWS区域


4
你需要指定你的凭证。查看这篇文章:https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_credentials
它详细介绍了如何进行操作:
指定您的凭证和AWS区域以使用AWS CDK CLI。CDK按以下顺序查找凭证和区域:
- 使用cdk命令的--profile选项。 - 使用环境变量。 - 使用由AWS CLI设置的默认配置文件。
你可以使用AWS CLI设置一个配置文件。请参阅https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html获取详细信息。你可以指定命名配置文件,例如每个帐户一个配置文件,并指定要用于CDK调用的配置文件名称。

6
我已经这样做了,并使用了--profile <profile_name>,但它没有起作用。 - Drew Gallagher

4
在您的 .aws 文件夹中创建/添加一个名为credentials(无文件扩展名)的空文件。

3

CDK产生的错误是因为它无法解析有效的AWS CLI凭证,这些凭证允许它通过类似于以下调用来解析账户:

aws sts get-caller-identity --profile profile_name

有多种方法可以配置AWS CLI以使用有效凭据,以便CDK可以与CLI配置交互以获取凭据

  1. 在~/.aws/credentials中,这是最简单但不太安全的方式,因为它使用长期凭证。您可以像这样放置分配给IAM用户的长期凭证。
    [default]
    aws_access_key_id=AKIAI44QH8DHBEXAMPLE
    aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
  1. 使用凭证处理https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sourcing-external.html

在~/.aws/config文件中

[profile developer]
credential_process = /opt/bin/awscreds-custom --username helen
  1. 使用更安全的工具,例如https://github.com/99designs/aws-vault

  2. 使用AWS CLI与AWS SSO集成。此设置允许在多个帐户之间进行SSO,并支持多种MFA策略,包括生物识别。但问题在于,CDK的当前版本尚未更新为使用最新版本的Node AWS SDK,因此它不知道如何检索凭据。希望CDK的未来版本能够解决这个问题,但已经过去了近2年。

在 ~/.aws/config 中

[profile sso_profile]
sso_start_url = https://sso_url.awsapps.com/start
sso_region = us-east-2
sso_account_id =
sso_role_name = AWSAdministratorAccess
region = us-east-2
output=json
 

幸运的是,有一个不错的解决方法,一旦配置好就可以无缝使用。这涉及到利用一个python库,将SSO档案作为凭证过程暴露出来,该过程受当前CDK支持。 安装https://pypi.org/project/aws2-wrap/

pip3 install aws2-wrap==1.2.7

然后在~/.aws/config中添加一个包装器配置文件,使用aws2-wrap公开作为凭据处理程序。
[profile wrapped_sso_profile]
region = us-east-2
credential_process = aws2-wrap --process --profile sso_profile

1
如果您使用SSO并且不想安装Python库,您可以直接调用export AWS_PROFILE=<my-profile-name>,然后手动执行aws sso login。之后,cdk deploy对我来说可以正常工作。 - Elias Strehle

2
如果您正在使用AWS SSO作为登录方式,一旦执行了source .venv/bin/active,请执行以下操作设置会话:
aws sso login --profile profile_name

然后执行:

cdk deploy --profile profile_name

当您的SSO凭据过期时,也会发生这种情况。执行aws sso login --profile profile_name命令可以解决这个问题。 - undefined

2
您应在初始化堆栈时明确设置您的账户和区域。 AWS CDK CLI 提供两个环境变量,CDK_DEFAULT_ACCOUNT 和 CDK_DEFAULT_REGION,用于确定合成目标。
new MyDevStack(app, 'dev', { 
  env: { 
    account: process.env.CDK_DEFAULT_ACCOUNT, 
    region: process.env.CDK_DEFAULT_REGION 
}});

如果使用这些环境变量,则目标帐户和区域将从您的活动AWS配置文件(例如,--profile选项)中获取。

https://docs.aws.amazon.com/cdk/latest/guide/environments.html


1
好的,这很有道理,但是当我运行“cdk diff --profile <profile_name>”时,它仍然给出相同的错误。 - Drew Gallagher
文档还建议在开发过程中这样做是“可接受甚至是理想的”,但在生产环境中可能会成为反模式,并建议将其作为备用方案使用,例如 account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT, - Davos

1

sudo让我头疼...

我在运行cdk deploy时一直遇到同样的错误。我一直在重复运行:

$ sudo cdk deploy --profile default

并且得到了相同的错误。最终我使用了-v选项,阅读了每一行代码,并意识到它没有使用我的.aws/credentials文件,而是在寻找/root/.aws/credentials

去掉sudo后,一切都正常了。

$ cdk deploy --profile default

0

我刚刚创建了一个新的配置文件。

aws configure --profile profile2

aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXX
region = us-west-2
output=text

cdk deploy --profile profile2

我尝试了各种方法,最终这个方法帮助了我。只是一个快速的提示,直到最后一个输出之前,我从未添加过输出。也许完全填写的配置文件也有所帮助。

参考:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
'cdk' is not recognized as an internal or external command, operable program or batch file. - john k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接