Javascript 如何使用AWS CDK查找现有ApiGateway

Javascript 如何使用AWS CDK查找现有ApiGateway,javascript,amazon-web-services,aws-lambda,aws-api-gateway,aws-cdk,Javascript,Amazon Web Services,Aws Lambda,Aws Api Gateway,Aws Cdk,我正在使用AWS CDK构建lambda,我想从lambda的CDK堆栈中注册端点 我发现我可以使用fromRestApiId(scope,id,restApiId)获取现有的ApiGateway构造 () 因此,目前这种方法效果良好: //TODO how to look up by ARN instead of restApiId and rootResourceId?? const lambdaApi = apiGateway.LambdaRestApi

我正在使用AWS CDK构建lambda,我想从lambda的CDK堆栈中注册端点

我发现我可以使用fromRestApiId(scope,id,restApiId)获取现有的ApiGateway构造 ()

因此,目前这种方法效果良好:

    //TODO how to look up by ARN instead of restApiId and rootResourceId??
    const lambdaApi = apiGateway.LambdaRestApi
                                .fromRestApiAttributes(this, generateConstructName("api-gateway"), {
                                    restApiId: <API_GATEWAY_ID>,
                                    rootResourceId: <API_GATEWAY_ROOT_RESOURCE_ID>,
                                });

    const lambdaApiIntegration = new apiGateway.LambdaIntegration(lambdaFunction,{
        proxy: true,
        allowTestInvoke: true,
    })

    const root = lambdaApi.root;

    root.resourceForPath("/v1/meeting/health")
        .addMethod("GET", lambdaApiIntegration);
//TODO如何通过ARN而不是restApiId和rootResourceId查找??
常量lambdaApi=apiGateway.LambdaRestApi
.FromRestapiAttribute(此,generateConstructName(“api网关”){
restApiId:,
rootResourceId:,
});
const lambdaApiIntegration=new apiGateway.lambdainintegration(lambdaFunction{
代理:是的,
allowTestInvoke:对,
})
const root=lambdaApi.root;
root.resourceForPath(“/v1/meeting/health”)
.addMethod(“GET”,lambdaApiIntegration);
但我想部署到许多AWS帐户和许多地区。我不想为每个帐户区域对硬编码API\u GATEWAY\u IDAPI\u GATEWAY\u ROOT\u RESOURCE\u ID

是否有更通用的方法获取现有的ApiGateway构造(例如,通过名称或ARN)


提前感谢您。

让我们用一个资源获取一个简单的Api

const restApi = new apigw.RestApi(this, "my-api", {
  restApiName: `my-api`,
});
const mockIntegration = new apigw.MockIntegration();
const someResource = new apigw.Resource(this, "new-resource", {
  parent: restApi.root,
  pathPart: "somePath",
  defaultIntegration: mockIntegration,
});
someResource.addMethod("GET", mockIntegration);
假设我们想在另一个堆栈中使用这个api和资源,我们首先需要导出

new cdk.CfnOutput(this, `my-api-export`, {
  exportName: `my-api-id`,
  value: restApi.restApiId,
});

new cdk.CfnOutput(this, `my-api-somepath-export`, {
  exportName: `my-api-somepath-resource-id`,
  value: someResource.resourceId,
});
现在我们需要导入新的堆栈

const restApi = apigw.RestApi.fromRestApiAttributes(this, "my-api", {
  restApiId: cdk.Fn.importValue(`my-api-id`),
  rootResourceId: cdk.Fn.importValue(`my-api-somepath-resource-id`),
});
只需添加额外的资源和方法

const mockIntegration = new apigw.MockIntegration();
new apigw.Resource(this, "new-resource", {
  parent: restApi.root,
  pathPart: "new",
  defaultIntegration: mockIntegration,
});

什么是Api网关的ARN,我没有看到。您是指我们在IAM策略中提到的
arn:aws:execute api:region:accountId:apid/*
?它仍然有api id的一部分。因此,无论我们选择使用堆栈导入或环境变量或堆栈输入参数化CDK代码,我们都必须选择包含api id。要点:}我发现了这一点,但可能因为没有直接ARN,所以我们无法通过ARN查找现有的api构造。大多数情况下,我已经从CloudFormation/CDK导出了api id,并将其导入到使用它的其他堆栈/CDK中。如果你想让我写一个有细节的答案,请告诉我。如果你能写一些关于出口的东西,那将是令人惊讶的!我们需要在其他CDK堆栈中执行此操作,我们希望引用一组资源的导出(导出一组安全组,CDK可以通过名称引用导出,而不是通过帐户/区域-唯一名称引用唯一安全组)。这看起来正是我们需要的!谢谢你,巴鲁!如何获取导入的API的URL以显示为输出?当我们获得现有api时,“restApi.url”不存在。@MehradEslami没有cdk返回的url/cloudformation是返回值的列表。您始终可以使用api id构建自己的url感谢Balu,它使用api id和路径创建了url。