标签: aws-cdk

将 Cognito 授权者添加到 CDK 中的 Api 网关 LambdaRestAPI

我正在尝试将 Cognito Authorizer 添加到现有的 API Gateway LambdaRestApi。这是一个完整的代理集成,我希望授权者默认应用于所有方法。我从文档中看不到任何指示如何通过 CDK 完成此操作。

我拥有的:

const userPool = new cognito.UserPool(this, "TestUsers", {
      userPoolName: "This is a test"
    });

const proxyApi = new apig.LambdaRestApi(this, "HelloFoodSecureProxyApi", {
      handler: proxyHandlerLambdaFunction
    });

// proxyApi.addDefaultAuthorizor(userPool)
Run Code Online (Sandbox Code Playgroud)

据我所知,我将不得不恢复使用 raw RestApi,添加一个覆盖我的整个API的Resourceand Method,并使用类似的东西手动覆盖底层CFNGET_resource.add_property_override("AuthorizerId", {"Ref": authorizor.auth_id})

我错过了什么吗?有什么建议吗?如果我可以帮助的话,我宁愿不将我的整个 API(轻松地proxy转换为代码)解压到基础设施中。

amazon-web-services amazon-cognito aws-api-gateway aws-cdk

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

CDK ECR:如何设置存储库名称和标签

如何在CDK的DockerImageAsset上设置存储库名称和标签?

这是我的代码:(常规)

private uploadImage(String name, File directory, File jarFile) {
    def asset = DockerImageAsset.Builder.create(scope, cdkId("$name-image"))
            .directory(directory.toString())
            .buildArgs([
                    "jarFile"    : jarFile.name,
                    "environment": config.environment
            ])
            .build()
    println "ImageURL: $asset.imageUri"
}
Run Code Online (Sandbox Code Playgroud)

这是打印的图像网址:

ImageURL: 9999999999999.dkr.ecr.us-west-2.${Token[AWS.URLSuffix.1]}/aws-cdk/assets:89ae89e0b3f7652a4ac70a4e18d6b2acec2abff96920e81e6487da58c8b820f3
Run Code Online (Sandbox Code Playgroud)

我想 CI/CD 就是这样,存储库名称/标签并不重要。

但是,如果您需要在 CI/CD 环境之外使用此映像,则会变得一团糟,因为我们在同一存储库 (aws-cdk/assets) 中有许多不同的项目和版本。

我看到一个名为“repositoryName”的方法,但它已被弃用,并且我找不到替代方法或解释为什么它被弃用。

java groovy amazon-ecr aws-cdk

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

当 ECR 映像引用代码时,AWS CDK 更新 lambda 函数代码

我有一个 Lambda 堆栈,位于与 Lambda 代码本身分开的存储库中。Lambda 代码作为 docker 映像打包并部署到 ECR,然后单独的 Lambda 堆栈将代码作为DockerImageFunctionusingaws_lambda.DockerImageCode.from_ecr()方法引用。这似乎已经正确部署了初始函数,但是在将 Lambda 代码的新映像发布到 ECR,然后cdk deploy使用 Lambda 堆栈从存储库运行后,它只是说没有发现任何差异。如何引用我的 Lambda 代码,以便在部署构造时看到代码已更改并更新 Lambda 函数代码(就像 cliaws lambda update-function-code调用那样)?我在使用引用 Lambda 堆栈本地代码(如在同一存储库中)的代码资产之前已经完成了此操作,但是当代码没有被引用为 Lambda 代码时,如何让堆栈识别 Lambda 代码中的更改本地资产?

我意识到对于是否将堆栈组织在单一存储库中还是在单独的存储库中组织堆栈以及它们负责部署的任何应用程序代码存在一些争论,但为了讨论这一点,我更感兴趣的是如何完成 Lambda 函数的更新当堆栈与代码分离时。

amazon-web-services aws-lambda aws-cdk

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

如何获取 CDK (AWS) 中 api 密钥的值

我有这个问题。我想创建一个只能使用 API 密钥访问的 API 网关 - 这部分已经完成。现在我想将 API 密钥的值存储在机密管理器中。我能够在机密管理器中存储硬编码值,但不能存储 API 密钥的实际值。创建 api 密钥的代码是:

const key = api.addApiKey('ApiKey');
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式在秘密管理器中存储硬编码值:

const secret = new secretsmanager.Secret(this, 'Secret', {
      description: "Secret ",
      secretName: "secret",
      generateSecretString: {
        secretStringTemplate: JSON.stringify({"api_key" : "some_value"}),
        generateStringKey: "string_key",
      }
    });
Run Code Online (Sandbox Code Playgroud)

如何存储 api 密钥而不是硬编码值?

api amazon-web-services aws-cdk

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

AWS CDK - 无法在 Lambda 中承担细粒度授权的角色

我对 AWS 的具体情况相当陌生,所以请原谅我提出一个愚蠢的问题。我一直在寻找答案,但没有找到任何可以回答我的问题的问题。

我正在构建一个项目,并尝试使用此 AWS 教程正确获得权限:https://aws.amazon.com/blogs/apn/partitioning-pooled-multi-tenant-saas-data-with-amazon-动态数据库/

我创建了角色和策略:

const tenantUserRole = new Role(this, "TenantUserRole", {
      assumedBy: new ServicePrincipal("lambda.amazonaws.com"),
    });
table.grantReadWriteData(tenantUserRole);
Run Code Online (Sandbox Code Playgroud)

然后,在我的 Lambda 中,我尝试:

const role = await stsClient.send(
    new AssumeRoleCommand({
      Policy: getPolicy("tenant"),
      RoleArn: process.env.TENANT_ROLE_ARN,
      RoleSessionName: "foo",
    })
  );
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我在 Lambda 中收到错误:

{ "errorType": "AccessDenied", "errorMessage": "用户:arn:aws:sts::xxx:assumed-role/ProjectStack-createUserServiceRoleB9D8AADE-GRDI6MWXA5MY/ProjectStack-createUserC6ED88E6-K0S95UXTN9MH 无权执行: sts:AssumeRole on资源:arn:aws:iam::xxx:role/ProjectStack-TenantUserRoleB79B8D3A-11N644X7UF0SR","trace":["AccessDenied:用户:arn:aws:sts::xxx:assumed-role/ProjectStack-createUserServiceRoleB9D8AADE-GRDI6MWXA5MY/ProjectStack -createUserC6ED88E6-K0S95UXTN9MH 无权对资源执行:sts:AssumeRole:arn:aws:iam::xxx:role/ProjectStack-TenantUserRoleB79B8D3A-11N644X7UF0SR",

目标是始终根据用户上下文解析权限,那么我应该在 CDK 堆栈中做什么才能使我的所有 Lambda 能够执行必须执行的操作?

amazon-web-services amazon-iam serverless aws-serverless aws-cdk

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

如何获取/设置AWS ECS容器实例角色

在AWS控制台中创建基于EC2的ECS集群时,您可以指定容器实例角色:

在此输入图像描述

但是,创建集群后,我看不到任何方法来查看哪个角色附加到集群。

此外,在使用cli或在Cloudformation(或者扩展为 CDK)中创建集群时,我没有看到任何指定容器实例角色的方法。

我的问题有两个:

  1. 这个属性可以在API/Cloudformation中指定吗
  2. 有没有办法在控制台或使用 API/CLI 中查看现有集群上的此属性

amazon-web-services amazon-ecs aws-cloudformation aws-cdk

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

CDK 将映射模板添加到 LambdaIntegration

我有一个 Lambda 函数,可以通过 api 网关访问。

如何让 CDK 添加映射模板,如下屏幕截图所示:

在此输入图像描述

我尝试了多种变体:

....

const restApi = new apigateway.LambdaRestApi(this, "dyndns-api", {
  handler: dyndnsLambda,
  proxy: false,
  domainName: {
    domainName: siteDomain,
    certificate: certificate,
    endpointType: apigateway.EndpointType.REGIONAL
  }
});

const methodResponse: apigateway.MethodResponse = {
  statusCode: "200", 
  responseModels: {"application/json": apigateway.Model.EMPTY_MODEL}
}

const requestTemplate = {
  "execution_mode" : "$input.params('mode')",
  "source_ip" : "$context.identity.sourceIp",
  "set_hostname" : "$input.params('hostname')",
  "validation_hash" : "$input.params('hash')"
}

const dnydnsIntegration = new apigateway.LambdaIntegration(dyndnsLambda, {
  allowTestInvoke: true,
  passthroughBehavior: apigateway.PassthroughBehavior.WHEN_NO_TEMPLATES,
  requestTemplates: { "application/json": JSON.stringify(requestTemplate) },
});

restApi.root.addMethod("GET", dnydnsIntegration, {
  methodResponses: [methodResponse] …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-api-gateway aws-cdk

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

使用 AWS CDK 的 API 网关 GET 方法请求 URL 查询字符串参数

我正在使用 CDK 配置 API 网关,但我正在努力处理 GET 方法请求中的 URL 查询字符串参数。我可以找到集成请求的示例,但找不到方法请求的示例。

这些是我使用控制台定义的 URL 查询字符串参数,我的问题是如何使用 CDK 在 TypeScript 中复制它? 在此输入图像描述

我检查了CDK文档希望找到实现。我期望它可以在MethodOptions 接口下,但对我的情况没有任何用处。

amazon-web-services typescript aws-api-gateway aws-cdk

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

在 CDK CodePipelines 中添加手动审批阶段

我一直在使用 AWS CDK,我认为这是使用 AWS 的好方法。最近我遇到了一个我无法解决的问题。查看了文档和资源,但没有人解释如何在 CDK 中执行此操作。因此,我有两个代码管道,每个管道要么部署到登台,要么部署到生产。现在我想要在代码部署到生产之前有一个手动批准阶段。我将在下面展示我的简单代码以供参考:

import * as cdk from '@aws-cdk/core';
import { AppsPluginsCdkStack } from './apps-plugins-services/stack';
import {
  CodePipeline,
  ShellStep,
  CodePipelineSource
} from '@aws-cdk/pipelines';

class ApplicationStage extends cdk.Stage {
  constructor(scope: cdk.Construct, id: string) {
    super(scope, id);
    new CdkStack(this, 'cdkStack');
  }
}

class ProductionPipelineStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    //Create the CDK Production Pipeline
    const prodPipeline = new CodePipeline(this, 'ProductionPipeline', {
      pipelineName: 'ProdPipeline',
      synth: new ShellStep('ProdSynth', {
        // Use a …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services typescript aws-codepipeline aws-cdk

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

AWS CDK 是否可以创建具有空白或占位符值的密钥?

我正在将 CodePipeline 连接到 Github,所以我添加了以下行:

CodePipelineSource.gitHub("username/repo", "main", {
   authentication: cdk.SecretValue.secretsManager("github-token")
})
Run Code Online (Sandbox Code Playgroud)

当我运行时cdk deploy,它会按预期失败:

Pipeline/Pipeline (Pipeline9850B417) Secrets Manager can't find the specified secret. (Service: AWSSecretsManager; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: eaa59d67-bb64-472c-abc4-9d4896c09d7e; Proxy: null)
Run Code Online (Sandbox Code Playgroud)

CDK 是否可以使用空白或占位符值创建密钥,这样它仍然会因某种访问被拒绝而失败,但随后我可以转到 AWS 控制台并只需填写该值。

澄清:我不期望 CDK 创建 OAuth 令牌。我想要实现的是 run cdk deploy,让它失败,转到 Secrets Manager 并找到带有占位符值的秘密,输入该值,cdk deploy再次运行,然后这次成功。

aws-secrets-manager aws-cdk

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