我正在使用 CDK 通过 API Gateway、Lambda 和 DynamoDB 创建一个简单的无服务器项目。到目前为止看起来很酷,但是当我向 Lambda 添加外部依赖项时出现以下错误:
"Runtime.ImportModuleError: Error: Cannot find module './uuid-random'",
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我并不是在问这个错误的问题是什么,因为这是有详细记录的。我正在寻求帮助,因为到目前为止我尝试压缩依赖项失败了。
我已经做了研究,而且我并不是唯一遇到这种情况的人。然而,我有点困惑该走哪条路。我需要捆绑我的依赖项,但到目前为止,所有示例对于我正在做的事情来说都相当复杂,并且没有一个示例适合。我还看到了使用的建议fromAsset,但这也不起作用(cdk部署刚刚挂起)。因此,我非常感谢任何帮助解决这个看似简单的问题的帮助。TIA。
项目结构:
bin/
cdkProject.js
handlers/
api.js
lib/
cdkProject-stack.js
node_modules/
test/
.gitignore
cdk.json
package.json
tsconfig.json
Run Code Online (Sandbox Code Playgroud)
Lambda (api.js)
const AWS = require("aws-sdk");
const db = new AWS.DynamoDB;
const TABLE_NAME = process.env.TABLE_NAME || "";
const PRIMARY_KEY = process.env.PRIMARY_KEY || "";
const uuid = require('./uuid-random');
async function postProduct(event) {
const params = {
TableName: TABLE_NAME,
Item: {
"id": {
S: uuid()
},
"name": {
S: …Run Code Online (Sandbox Code Playgroud) 我在获取特定 Secrets Manager Secret 键值以通过 CDK 将其传递给我的 lambda 时遇到一些问题。
一段时间后,我终于意识到,SecretValue 只有当我实际将其部署到 lambda 时,我的问题才得到解决,而不是通过 SAM CLI 在本地运行时得到解决。通过做
cdk.SecretValue.secretsManager(secretId).toString()
Run Code Online (Sandbox Code Playgroud)
我得到类似的东西"{\"apiKey\":\"sdfsdf-sdfsdf-sddsf\"}",但我想直接拥有 apiKey 。不幸的是,在我的 CDK 代码中,我不能JSON:parse(...secretsManager(..).toString()) ,因为这只有在部署后才能解决。之前,该值很简单:(
{{resolve:secretsmanager:apiKey:SecretString:::}}这似乎是一个令牌: https: //docs.aws.amazon.com/cdk/latest/guide/tokens.html)
所以我想我需要某种方法来告诉 CDK 如何使用渲染值,也许通过传递一个转换渲染结果的回调 - 这可能吗?我可以在 CDK 设置中使用任何其他工具来允许我从秘密接收特定密钥,以便我可以将其直接传递给 lambda 吗?
我希望这个问题是可以理解的。在此先感谢您的帮助。
我正在尝试在 AWS CDK 上构建一个相对简单的堆栈,其中涉及ApplicationLoadBalancedFargateServicefrom aws-ecs-patterns.
我的问题涉及秘密。我在 Secrets Manager 中有一个秘密,其中有多个键/值(我认为从技术上讲,它存储为 JSON 文档,但 AWS 提供了一个键/值接口),我需要将它们单独传递到我的容器。我目前在等效的非 cdk(在控制台中创建)堆栈中通过简单地指定密钥来执行此操作,如下所示:arn:aws:secretsmanager:us-west-2:[acct]:secret/name-??????:KEY::,其中 `KEY 是秘密密钥,并且正确的值作为环境变量插入到容器中。
当我尝试使用 CDK 执行此操作时,当我使用 cdk 合成器时出现错误:
`secretCompleteArn` does not appear to be complete; missing 6-character suffix
Run Code Online (Sandbox Code Playgroud)
如果我删除最后一位 ( :KEY::),它会成功合成,但我的容器实际上并没有得到我想要的东西。
这就是我尝试在我的 cdk(打字稿)代码中使用它的方式:
new ApplicationLoadBalancedFargateService(this, 'Service', {
...
taskImageOptions: {
image: containerImage, // defined elsewhere
...
secrets: {
'DB_DATABASE': ecs.Secret.fromSecretsManager(
Secret.fromSecretCompleteArn(this, 'secret-DB_DATABASE',
'arn:aws:secretsmanager:us-west-2:[acct]:secret:secret/name-??????:KEY::')),
//there's really a few more, pulling keys from the same secret. Omitting for brevity
},
},
});
Run Code Online (Sandbox Code Playgroud)
有办法让这项工作发挥作用吗?或者我需要改变我存储/使用我的秘密的方式吗?
在 AWS CDK 中,我可以编写 Jest 单元测试来测试资源是否具有特定属性。但是如何测试不是属性的资源 DeletionPolicy 值?
cdk.out/example.template.json(简化)
"AppsUserPool8FD9D0C0": {
"Type": "AWS::Cognito::UserPool",
"Properties": {
"UserPoolName": "test",
...
},
"UpdateReplacePolicy": "Retain",
"DeletionPolicy": "Retain",
"Metadata": {}
}
Run Code Online (Sandbox Code Playgroud)
Jest 属性单元测试通过(简化)
expect(stack).toHaveResourceLike('AWS::Cognito::UserPool', {
"UserPoolName": "test"
});
Run Code Online (Sandbox Code Playgroud)
DeletionPolicy 的 Jest 单元测试失败(简化)
expect(stack).toHaveResourceLike('AWS::Cognito::UserPool', {
"DeletionPolicy": "Retain"
});
Run Code Online (Sandbox Code Playgroud) 我当前正在尝试识别现有的 MySQL 实例,并且希望允许我的 ECS 部署能够连接到它。
迄今为止的进展如下:
const rdsPrimaryDatabase = rds.DatabaseInstance.fromDatabaseInstanceAttributes(this, 'ApplicationReadWrite', {
instanceEndpointAddress: "application_database_ewqqqrqw.eu-west-1.rds.amazonaws.com", port: 3305, securityGroups: [],
instanceIdentifier: 'application_database'
});
const securityGroup = new ec2.SecurityGroup(this, 'ApplicationEcsSecurityGroup', {
vpc: vpc,
allowAllOutbound: true,
securityGroupName: 'ApplicationEcsSecurityGroup',
})
securityGroup.connections.allowTo(rdsPrimaryDatabase, 3306, 'Primary Database')
Run Code Online (Sandbox Code Playgroud)
上述内容目前导致以下错误,与最后一行相关:
Argument of type 'IDatabaseInstance' is not assignable to parameter of type 'IConnectable'.
The types of 'connections.defaultPort' are incompatible between these types.
Run Code Online (Sandbox Code Playgroud)
这个错误是完全可以理解的,但我不确定如何克服这个问题 - 而且我不太确定我是否以正确的方式做这件事。
任何帮助表示赞赏。
AWS CDK 提供InterfaceVpcEndpoint和VpcEndpoint。这两种结构有什么区别?
我正在尝试使用 cdk bootstrap 命令。
>$env:CDK_NEW_BOOTSTRAP=1
>npx cdk bootstrap --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess aws://1234.../us-east-1
Run Code Online (Sandbox Code Playgroud)
我得到输出:
CDK_NEW_BOOTSTRAP set, using new-style bootstrapping.
Bootstrapping environment aws://1234.../us-east-1...
Run Code Online (Sandbox Code Playgroud)
我现在只是挂着。有一次我一个多小时后回来尝试,但它仍然卡住了。带有前缀 cdk 的 s3 存储桶确实出现了,但没有文件。
我尝试运行它几次,但总是一样。
什么会导致它陷入这样的困境?
根据 vt102 的评论,我从命令中发现了一些错误。
>$env:CDK_NEW_BOOTSTRAP=1
>npx cdk bootstrap --cloudformation-execution-policies --verbose --debug arn:aws:iam::aws:policy/AdministratorAccess aws://1234.../us-east-1
Run Code Online (Sandbox Code Playgroud)
现在的输出是:
Waiting for stack CDKToolkit to finish creating or updating...
Stack CDKToolkit has an ongoing operation in progress and is not stable (REVIEW_IN_PROGRESS (User Initiated))
Run Code Online (Sandbox Code Playgroud)
关于不稳定堆栈的第二行每隔几秒就会重复一次。
我进入 AWS 控制台并在 CloudFormation -> Stacks 下查看,但没有列出任何堆栈。我尝试更改状态过滤器,但没有任何效果。
如何找到并删除这个不稳定的堆栈并重新开始?
我记得当我第一次尝试 cdk 命令时,我在帐号和区域中出现了语法错误。它被卡住了,我杀了它。那可能就是它进入无效状态的时候。
那
我的 CDK 堆栈使用以下 CodeBuild 项目定义了 CodePipeline:
\nproject_build = codebuild.Project(self, "ProjectBuild",\n project_name = "Build",\n source = github_source,\n environment = codebuild.BuildEnvironment(\n build_image = codebuild.LinuxBuildImage.AMAZON_LINUX_2_2,\n privileged = True),\n environment_variables = { \xe2\x80\xa6 },\n build_spec = codebuild.BuildSpec.from_source_filename("cdk/buildspec/build.yml"))\nRun Code Online (Sandbox Code Playgroud)\n我正在使用 Amazon Linux 2 映像,并且想要在其上安装 PostgreSQL,因此我制作了这个简单的构建规范测试文件:
\nversion: 0.2\n\nphases: \n install:\n commands:\n - amazon-linux-extras install postgresql13\n build: \n commands:\n - echo "foo"\nRun Code Online (Sandbox Code Playgroud)\n这是作业引发的错误:
\n[Container] 2021/10/12 16:50:32 Entering phase INSTALL\n[Container] 2021/10/12 16:50:32 Running command amazon-linux-extras\n/root/.pyenv/versions/3.8.10/bin/python: No module named amazon_linux_extras\n\n[Container] 2021/10/12 16:50:34 Command did not …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-codepipeline aws-codebuild amazon-linux aws-cdk
我想使用 CDK 代码创建 IAM 角色的以下信任关系
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ABC>:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<ID>"
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<XYZ>:root"
},
"Action": "sts:AssumeRole"
}
]
}
Run Code Online (Sandbox Code Playgroud)
上述策略是使用 AWS 控制台直接创建的,但是当我通过 CDK 代码创建它时,我得到类似以下内容的信息:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<XYZ>:root",
"arn:aws:iam::<ABC>:root"
]
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<ID>"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我使用以下 CDK 代码来实现此目的:
const …Run Code Online (Sandbox Code Playgroud) Secrets Manager我在 Account-1 中有一个秘密键值对us-east-1。此秘密使用客户管理的 KMS 密钥进行加密 - 我们称之为KMS-Account-1。所有这些都是通过控制台创建的。
现在我们转向CDK. 我们已经将cdk.pipelines.CodePipeline其部署Lambda到多个阶段/环境 - 所以从第一个到{ Account-2, us-east-1 }然后到{ Account-3, eu-west-1 }等等。这已经完成了。
us-east-1 SecretsManager上述所有阶段/环境中的 lambda 代码现在都需要更改为通过客户端获取Account-1 中存在的秘密键值对secretsmanager。该代码可能应如下所示 ( python):
client = boto3.session.Session().client(
service_name = 'secretsmanager',
region_name = 'us-east-1'
)
resp = client.get_secret_value(
SecretId='arn:aws:secretsmanager:us-east-1:<ACCOUNT-1>:secret:name/of/the/secret'
)
secret = json.loads(resp['SecretString'])
Run Code Online (Sandbox Code Playgroud)
各个帐户和区域(即环境)中的所有 lambda 表达式都将具有与上述完全相同的代码,因为需要从us-east-1.
cdk代码以促进这一点?代码管道中的代码部署如何获得导入此自定义kms密钥的权限,并SecretManager' secret通过 cdk 管道创建的 lambda 为跨帐户访问应用正确的权限?有人可以指点一下吗?
aws-lambda amazon-kms aws-codepipeline aws-secrets-manager aws-cdk
aws-cdk ×10
aws-lambda ×2
typescript ×2
amazon-ecs ×1
amazon-iam ×1
amazon-kms ×1
amazon-linux ×1
amazon-vpc ×1
jestjs ×1
node-modules ×1
node.js ×1
vpc-endpoint ×1