You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS CDK(TypeScript)为CloudFront添加API Gateway行为遇循环依赖问题

解决CDK中CloudFront与API Gateway的循环依赖问题

问题根源

当使用RestApiOrigin关联CloudFront与API Gateway时,CDK会自动为API Gateway生成资源策略,允许对应的CloudFront分发访问API。但此时出现双向依赖:

  • CloudFront需要API的Endpoint地址来配置Origin
  • API的资源策略需要CloudFront的分发ID来生成访问权限
    这种双向依赖导致CDK无法解析部署顺序,触发循环依赖错误。

解决方案

通过手动管理API Gateway的资源策略,打破双向依赖:

  • 先创建仅包含S3默认行为的CloudFront分发
  • 创建API Gateway时,避免依赖CDK自动生成的CloudFront权限策略
  • 手动添加API资源策略,允许目标CloudFront分发访问API
  • 使用HttpOrigin而非RestApiOrigin配置CloudFront的API行为,避免自动生成策略

修改后的代码

// 1. 先创建CloudFront分发,仅配置S3静态网站默认行为
const cdn = new cloudfront.Distribution(this, "websitecdn", {
    defaultBehavior: {origin: new origins.S3Origin(s3_bucket)}
});

// 2. 创建API Gateway,禁用自动关联CloudFront的权限策略
const api = new apigw.RestApi(this, 'someapi', {
    defaultCorsPreflightOptions: enableCors
});

const loginApi = api.root.addResource('login', {defaultCorsPreflightOptions: enableCors});
loginApi.addMethod('POST', new apigw.LambdaIntegration(loginLambda, {
    proxy: false,
    integrationResponses: [LambdaIntegrationResponses]
}), {
    methodResponses: [LambdaMethodResponses]
});

// 3. 手动为API Gateway添加资源策略,允许当前CloudFront分发访问
const apiArn = api.arnForExecuteApi('*', '/*', '*');
api.addToResourcePolicy(new iam.PolicyStatement({
    effect: iam.Effect.ALLOW,
    principals: [new iam.ServicePrincipal('cloudfront.amazonaws.com')],
    actions: ['execute-api:Invoke'],
    resources: [apiArn],
    conditions: {
        StringEquals: {
            'AWS:SourceArn': `arn:aws:cloudfront::${cdk.Aws.ACCOUNT_ID}:distribution/${cdn.distributionId}`
        }
    }
}));

// 4. 使用HttpOrigin配置API行为,避免自动生成依赖策略
const apiOrigin = new origins.HttpOrigin(`${api.restApiId}.execute-api.${cdk.Aws.REGION}.amazonaws.com`, {
    originPath: `/${api.deploymentStage.stageName}`
});

cdn.addBehavior("/prod/*", apiOrigin, {
    allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,
    cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
    viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.HTTPS_ONLY,
});

关键改动说明

  • 替换RestApiOrigin为HttpOrigin:绕开CDK自动生成API资源策略的逻辑,避免双向依赖
  • 手动添加API资源策略:明确指定允许访问的CloudFront分发,依赖关系变为单向(CloudFront依赖API地址,API依赖CloudFront ID),CDK可按顺序解析部署流程

内容的提问来源于stack exchange,提问作者Aakash Mathai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:55:17