标签: aws-cdk

如何在 AWS CDK 堆栈中压缩 Node Lambda 依赖项?

我正在使用 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)

node.js node-modules aws-lambda aws-cdk

3
推荐指数
2
解决办法
8181
查看次数

使用 CDK 将 AWS SM 密钥传递到 Lambda 环境

我在获取特定 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 吗?

我希望这个问题是可以理解的。在此先感谢您的帮助。

amazon-web-services typescript aws-cdk

3
推荐指数
2
解决办法
1万
查看次数

AWS CDK - 为容器指定密钥时是否可以访问 Secrets Manager 密钥中的单个 (JSON) 值?

我正在尝试在 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)

有办法让这项工作发挥作用吗?或者我需要改变我存储/使用我的秘密的方式吗?

amazon-web-services amazon-ecs aws-secrets-manager aws-cdk

3
推荐指数
1
解决办法
4323
查看次数

AWS CDK Jest 单元测试资源具有删除策略

在 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)

jestjs aws-cdk

3
推荐指数
2
解决办法
1202
查看次数

允许从 ECS 连接到现有 RDS 数据库吗?

我当前正在尝试识别现有的 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)

这个错误是完全可以理解的,但我不确定如何克服这个问题 - 而且我不太确定我是否以正确的方式做这件事。

任何帮助表示赞赏。

amazon-web-services typescript aws-cdk

3
推荐指数
1
解决办法
1158
查看次数

3
推荐指数
1
解决办法
2090
查看次数

是什么导致 cdk bootstrap 挂起?

我正在尝试使用 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 命令时,我在帐号和区域中出现了语法错误。它被卡住了,我杀了它。那可能就是它进入无效状态的时候。

amazon-web-services aws-cdk

3
推荐指数
1
解决办法
2913
查看次数

无法在 AWS CodeBuild 映像中使用 amazon-linux-extras

我的 CDK 堆栈使用以下 CodeBuild 项目定义了 CodePipeline:

\n
project_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"))\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 Amazon Linux 2 映像,并且想要在其上安装 PostgreSQL,因此我制作了这个简单的构建规范测试文件:

\n
version: 0.2\n\nphases: \n  install:\n    commands:\n      - amazon-linux-extras install postgresql13\n  build: \n    commands:\n      - echo "foo"\n
Run 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

3
推荐指数
1
解决办法
3417
查看次数

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)

amazon-web-services amazon-iam aws-cdk

3
推荐指数
1
解决办法
1万
查看次数

AWS-CDK:跨账户资源访问和资源参考

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.

  1. 首先,我希望这在概念上是可能的。是对的吗?
  2. 接下来我如何更改cdk代码以促进这一点?代码管道中的代码部署如何获得导入此自定义kms密钥的权限,并SecretManager' secret通过 cdk 管道创建的 lambda 为跨帐户访问应用正确的权限?

有人可以指点一下吗?

aws-lambda amazon-kms aws-codepipeline aws-secrets-manager aws-cdk

3
推荐指数
1
解决办法
6503
查看次数