aws-cdk Свяжите лямбда-функцию с CloudFront Web Distribution

Я пытаюсь создать веб-дистрибутив CloudFront с помощью aws-cdk. Я могу успешно создать веб-дистрибутив, но я еще не смог понять, как связать лямбда-функцию.

Ниже приведен фрагмент моего кода aws-cdk на Typescript для создания веб-дистрибутива CloudFront. Я удалил часть кода, который не имеет отношения к делу.

new cloudfront.CloudFrontWebDistribution(this, 'RetsFilesCDN', {
        originConfigs: [
            {
                s3OriginSource: {
                    originAccessIdentity: cfAccess, /* A CfnCloudFrontOriginAccessIdentity object created in earlier code */
                    s3BucketSource: files /* S3 bucket created in earlier code */
                },
                behaviors: [
                    {
                        compress: true,
                        defaultTtlSeconds: 172800,
                        isDefaultBehavior: true,
                        maxTtlSeconds: 31536000,
                        minTtlSeconds: 0
                    }
                ]
            }
        ]
    });

Код CloudFormation, который я пытаюсь сгенерировать, выглядит примерно так:

RetsFilesCDNCFDistribution6F414E1A:
Type: AWS::CloudFront::Distribution
Properties:
  DistributionConfig:
    CacheBehaviors:
      []
    Comment: CDN for files from the Real Estate RETS services that BranchCMS
      integrates with
    DefaultCacheBehavior:
      AllowedMethods:
        - GET
        - HEAD
      CachedMethods:
        - GET
        - HEAD
      Compress: true
      DefaultTTL: 172800
      ForwardedValues:
        Cookies:
          Forward: none
        QueryString: false
      MaxTTL: 259200
      MinTTL: 172800
      LambdaFunctionAssociations:
        - EventType: origin-response
          LambdaFunctionARN: lambdaFunctionArnHere
      TargetOriginId: origin1
      ViewerProtocolPolicy: redirect-to-https
    DefaultRootObject: index.html
    Enabled: true
    HttpVersion: http2
    IPV6Enabled: true
    Origins:
      - DomainName:
          Fn::GetAtt:
            - RetsFilesC9F78E92
            - DomainName
        Id: origin1
        S3OriginConfig:
          OriginAccessIdentity:
            Fn::Join:
              - ""
              - - origin-access-identity/cloudfront/
                - Ref: RetsFilesAccess
    PriceClass: PriceClass_100
    ViewerCertificate:
      AcmCertificateArn: arn:aws:acm:us-east-1:666445282096:certificate/25d4967c-c29a-4d11-983f-86d709769372
      SslSupportMethod: sni-only

Точная часть, которую я не могу создать, это:

LambdaFunctionAssociations:
   - EventType: origin-response
     LambdaFunctionARN: lambdaFunctionArnHere

Спасибо заранее за вашу помощь.


person Eric    schedule 31.12.2018    source источник
comment
На момент написания этой статьи добавление сырых переопределений CloudFormation было единственным способом, как вы уже выяснили.   -  person rix0rrr    schedule 03.01.2019


Ответы (2)


Я не уверен, что это лучший метод, но у меня сработало следующее.

import cdk = require('@aws-cdk/cdk');
import cloudfront = require('@aws-cdk/aws-cloudfront');
import lambda = require('@aws-cdk/aws-lambda');


export class MyStack extends cdk.Stack {
    constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
        super(parent, name, props);

        // Create the Lambda function
        const lambdaFunc = new lambda.Function(this, 'MyLambda', {
             YOUR_LAMBDA_PROPERTIES: HERE
        });

        // Create the CloudFront Web Distribution
        const cf = new cloudfront.CloudFrontWebDistribution(this, 'MyCDN', {
            YOUR_CLOUDFRONT_PROPERTIES: HERE
        });

        /**
         * THIS IS THE BEGINNING OF THE SOLUTION
         */

        // Get the CloudFront Distribution object to add the LambdaFunctionAssociations to
        const cfDist = cf.findChild('CFDistribution') as cloudfront.CfnDistribution;

        // Manually add the LambdaFunctionAssociations by adding an override
        cfDist.addOverride('Properties.DistributionConfig.DefaultCacheBehavior.LambdaFunctionAssociations', [{
            EventType: 'origin-response',
            LambdaFunctionARN: lambdaFunc.functionArn + ':2'
        }]);

        /**
         * END OF SOLUTION
         */ 
    }
}

person Eric    schedule 02.01.2019
comment
Похоже, есть изменение api. cf.findChild('CFDistribution') теперь должно быть cf.node.findChild('CFDistribution') - person Brian Takita; 10.11.2019
comment
Я получаю сообщение об ошибке с этим решением: Lambda@Edge cannot retrieve the specified Lambda function. Update the IAM policy to add pe rmission: lambda:GetFunction for resource: arn:aws:lambda:us-east-1:rest-of-arn:2 and try again. (Service: AmazonCloudFront; Status Code: 400; Error Code: InvalidLambdaFunctionAssociation; Request ID: uuid) - person Brian Takita; 11.11.2019
comment
Открыта проблема на github. github.com/aws/aws-cdk/issues/1474 - person Brian Takita; 13.11.2019

вы можете использовать это свойство для ассоциации лямбда-функции с поведением вашего облачного кеша

import { CfnDistribution.CacheBehaviorProperty } from '@aws-cdk/aws-cloudfront';
CfnDistribution.CacheBehaviorProperty.LambdaFunctionAssociations

для получения дополнительной информации нажмите на эту ссылку

person varnit    schedule 31.12.2018
comment
Вот вам за что. Я все еще немного не понимаю, как я интегрирую это в свой код и назначаю лямбда-ассоциацию моему облачному веб-дистрибутиву. - person Eric; 31.12.2018
comment
Обновлена ​​ссылка с эти вещи меняются так быстро. - person Jonathan DeMarks; 23.09.2019