该问题通常是由于未正确配置 Cloudfront 缓存策略而引起的。下面是一份示例代码,展示如何使用 AWS CDK 正确配置 Cloudfront 缓存策略,并向 ALB 进行转发。
import * as cloudfront from '@aws-cdk/aws-cloudfront';
import * as s3 from '@aws-cdk/aws-s3';
import * as targets from '@aws-cdk/aws-elasticloadbalancingv2';
import * as cdk from '@aws-cdk/core';
export class MyStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const albArn = 'arn:aws:elasticloadbalancing:us-east-1:111111111111:loadbalancer/app/my-load-balancer/2222222222222222';
const albDnsName = 'my-load-balancer-1234567890.us-east-1.elb.amazonaws.com';
const alb = targets.ApplicationLoadBalancer.fromBalancerAttributes(this, 'ALB', {
loadBalancerArn: albArn,
securityGroups: [],
vpc: ec2.Vpc.fromLookup(this, 'VPC', {
isDefault: true
}),
});
const cloudfrontOai = new cloudfront.OriginAccessIdentity(this, 'OriginAccessIdentity');
const s3Bucket = new s3.Bucket(this, 'Bucket', {
websiteIndexDocument: 'index.html',
websiteErrorDocument: '404.html'
});
const distribution = new cloudfront.CloudFrontWebDistribution(this, 'Distribution', {
originConfigs: [{
s3OriginSource: {
s3BucketSource: s3Bucket
},
behaviors: [{
isDefaultBehavior: true,
forwardedValues: {
queryString: true,
cookies: {
forward: 'all'
},
},
allowedMethods: cloudfront.CloudFrontAllowedMethods.ALL,
defaultTtl: cdk.Duration.seconds(0),
maxTtl: cdk.Duration.seconds(0),
minTtl: cdk.Duration.seconds(0),
}],
}, {
customOriginSource: {
domainName: albDnsName,
originProtocolPolicy: cloudfront.OriginProtocolPolicy.HTTPS_ONLY,
originHeaders: {
'host': alb.loadBalancerDnsName,
},
},
behaviors: [{
pathPattern: '/api/*',
allowedMethods: cloudfront.CloudFrontAllowedMethods.ALL,
forwardedValues: {
queryString: true,
cookies: {
forward: 'all'