Giter VIP home page Giter VIP logo

aws-cfn-custom-resource-lambda-edge's People

Contributors

nathan818fr avatar yvele avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

aws-cfn-custom-resource-lambda-edge's Issues

Graceful deletion

Hi,

First I would to like thank you for this project, you did a great job and it helped me set up cloudfront lambda@edge on my current project.

I have a little problem regarding graceful deletion of my stack when using your custom resources. The stack always fails to delete itself because the lambda@edge function cannot be deleted.

Do you have any tips on how we could manage a graceful stack deletion using your custom resource ?

Thanks for your help !

'CodeUri' is not a valid S3 Uri of the form 's3://bucket/key

Hi there,

I'm trying to get Lambda@edge working on eu-west and following your comments and library. Everything seemed to have installed fine and now i'm trying to get this example: https://aws.amazon.com/blogs/networking-and-content-delivery/resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog/, working on eu-west-1 but i'm running into a lot of problems.

See here my full template. Any idea on what could be the issue?

AWSTemplateFormatVersion: 2010-09-09

Transform: AWS::Serverless-2016-10-31

Resources:
  ImageBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: toms-test-bucket
      PolicyDocument:
        Statement:
            - Action:
                - s3:GetObject
              Effect: Allow
              Principal: "*"
              Resource: arn:aws:s3:::toms-test-bucket
            - Action:
                - s3:PutObject
              Effect: Allow
              Principal:
                AWS: !GetAtt EdgeLambdaRole.Arn
              Resource: arn:aws:s3:::toms-test-bucket
            - Action:
                - s3:GetObject
              Effect: Allow
              Principal:
                AWS: !GetAtt EdgeLambdaRole.Arn
              Resource: arn:aws:s3:::toms-test-bucket

  EdgeLambdaRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
            Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
                - "edgelambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/service-role/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"

  ViewerRequestFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://fot-lambda-code-bucket/cloudfront/viewer-request-function.zip
      Handler: index.handler
      Runtime: nodejs14.x
      MemorySize: 128
      Timeout: 1
      Role: !GetAtt EdgeLambdaRole.Arn

  ViewerRequestFunctionVersion:
    Type: "AWS::Lambda::Version"
    Properties:
      FunctionName: !Ref ViewerRequestFunction
      Description: "A version of ViewerRequestFunction"

  OriginResponseFunction:
   Type: AWS::Serverless::Function
   Properties:
     CodeUri: s3://fot-lambda-code-bucket/cloudfront/origin-response-function.zip
     Handler: index.handler
     Runtime: nodejs14.x
     MemorySize: 512
     Timeout: 5
     Role: !GetAtt EdgeLambdaRole.Arn

  OriginResponseFunctionVersion:
    Type: "AWS::Lambda::Version"
    Properties:
      FunctionName: !Ref OriginResponseFunction
      Description: "A version of OriginResponseFunction"

  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
        - DomainName: toms-test-bucket.s3.eu-west-1.amazonaws.com
          Id: myS3Origin
          S3OriginConfig: {}
        Enabled: 'true'
        Comment: distribution for content delivery
        DefaultRootObject: index.html
        DefaultCacheBehavior:
          TargetOriginId: myS3Origin
          LambdaFunctionAssociations:
            - EventType: 'viewer-request'
              LambdaFunctionARN: !Ref ViewerRequestFunctionVersion
            - EventType: 'origin-response'
              LambdaFunctionARN: !Ref OriginResponseFunctionVersion
          ForwardedValues:
            QueryString: 'true'
            QueryStringCacheKeys:
              - d
            Cookies:
              Forward: 'none'
          ViewerProtocolPolicy: allow-all
          MinTTL: '100'
          SmoothStreaming: 'false'
          Compress: 'true'
        PriceClass: PriceClass_All
        ViewerCertificate:
          CloudFrontDefaultCertificate: 'true'
  
  # Unused Lambda function only to get `CodeUri` working
  EdgeOriginRequestSource:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src
      AutoPublishAlias: live # Required to get `Version` parameter and force publication

  # Custom resource to "copy" the Lambda in the standard region (us-east-1)
  CopyOriginResponseFunctionLambda:
    Type: Custom::LambdaEdgeCopy
    Properties:
      ServiceToken: !ImportValue CustomResourceLambdaEdgeServiceToken
      Parameters:
        Version: !Ref OriginResponseFunctionVersion
        Region: us-east-1
  
  CopyViewerRequestFunctionLambda:
    Type: Custom::LambdaEdgeCopy
    Properties:
      ServiceToken: !ImportValue CustomResourceLambdaEdgeServiceToken
      Parameters:
        Version: !Ref ViewerRequestFunctionVersion
        Region: us-east-1


Outputs:
  ImageBucket:
    Value: toms-test-bucket
    Export:
      Name: !Sub "${AWS::StackName}-ImageBucket"

  MyDistribution:
    Value: !Ref MyDistribution
    Export:
      Name: !Sub "${AWS::StackName}-MyDistribution"

Resource not ready error on stack deploy

Hi,

First of all, thank you for creating this resource. I have been developing a small web app in eu-central-1 and it was going fairly well (for a beginner) until I got tripped up by Lambda@Edge only being available in eu-east-1...

I have cloned your repo and ran the install script provided. I am now trying to use the custom resource, however when I deploy the stack it fails and it refers me to have a look in the Cloudwatch logs. The relevant log entries seen below:

2021-02-22T11:16:54.844+02:00 2021-02-22T09:16:54.844Z 1497b0ca-72bc-4f2f-854e-33032dcbb69f INFO Wait for stackCreateComplete my-stack-XXXXXXXX-EdgeLambdaViewerRequest
2021-02-22T11:17:56.134+02:00 2021-02-22T09:17:56.133Z 1497b0ca-72bc-4f2f-854e-33032dcbb69f ERROR Lambda:Error ResourceNotReady: Resource is not in the state stackCreateComplete at constructor.setError (/var/runtime/node_modules/aws-sdk/lib/resource_waiter.js:182:47) ...

This is the full stack trace, though not sure if it is helpful

2021-02-22T09:17:56.133Z	1497b0ca-72bc-4f2f-854e-33032dcbb69f	ERROR	Lambda:Error ResourceNotReady: Resource is not in the state stackCreateComplete
    at constructor.setError (/var/runtime/node_modules/aws-sdk/lib/resource_waiter.js:182:47)
    at Request.CHECK_ACCEPTORS (/var/runtime/node_modules/aws-sdk/lib/resource_waiter.js:44:12)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12) {
  code: 'ResourceNotReady',
  retryable: false,
  time: 2021-02-22T09:17:56.132Z,
  statusCode: 200,
  retryDelay: 30000
}

This is the relevant part of the template

Distribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      # DependsOn: !Ref EdgeLambda
      DistributionConfig:
          Enabled: true
          PriceClass: PriceClass_100
          Comment: my-cf-distribution
          HttpVersion: http2
          IPV6Enabled: true
          ViewerCertificate:
            CloudFrontDefaultCertificate: true
          CustomErrorResponses:
            - ErrorCachingMinTTL: 0
              ErrorCode: 400
            - ErrorCachingMinTTL: 0
              ErrorCode: 403
            - ErrorCachingMinTTL: 0
              ErrorCode: 404
            - ErrorCachingMinTTL: 0
              ErrorCode: 405
            - ErrorCachingMinTTL: 0
              ErrorCode: 414
            - ErrorCachingMinTTL: 0
              ErrorCode: 416
            - ErrorCachingMinTTL: 0
              ErrorCode: 500
            - ErrorCachingMinTTL: 0
              ErrorCode: 501
            - ErrorCachingMinTTL: 0
              ErrorCode: 502
            - ErrorCachingMinTTL: 0
              ErrorCode: 503
            - ErrorCachingMinTTL: 0
              ErrorCode: 504
          Origins:
            - DomainName: !GetAtt MyBucket.DomainName
              Id: S3Origin
              S3OriginConfig: {}
          CacheBehaviors:
            - TargetOriginId: S3Origin
              ViewerProtocolPolicy: redirect-to-https
              DefaultTTL: 0
              MaxTTL: 0
              MinTTL: 0
              ForwardedValues:
                QueryString: false
                Cookies:
                  Forward: none
              PathPattern: 'url'
              AllowedMethods:
                - GET
                - HEAD
          DefaultCacheBehavior:
            TargetOriginId: S3Origin
            ViewerProtocolPolicy: redirect-to-https
            DefaultTTL: 0
            MaxTTL: 0
            MinTTL: 0
            ForwardedValues:
              QueryString: true
              Cookies:
                Forward: none
            AllowedMethods:
              - DELETE
              - GET
              - HEAD
              - OPTIONS
              - PATCH
              - POST
              - PUT
            LambdaFunctionAssociations:
              - EventType: viewer-request
                LambdaFunctionARN: !GetAtt EdgeLambdaViewerRequest.FunctionVersion

  # Only used to get CodeUri to actual edge lambda function in us-east-1
  EdgeLambdaSource:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ../src
      Handler: edge.lambdaHandler
      AutoPublishAlias: live

  # Custom resource to "copy" the Lambda in the standard region (us-east-1)
  EdgeLambdaViewerRequest:
    Type: Custom::LambdaEdge
    Properties:
      ServiceToken: !ImportValue CustomResourceLambdaEdgeServiceToken
      Parameters:
        LambdaSourceArn: !Ref EdgeLambdaSource.Version
        LambdaRoleArn: !Ref EdgeLambdaRole

  EdgeLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - lambda.amazonaws.com
            - edgelambda.amazonaws.com
          Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        - arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess
      Policies:
        - PolicyName: CustomPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Resource: "*"
                Action: lambda:InvokeFunction

I suspect that it's not something wrong with your resource and instead something that I'm messing up, but some help would be greatly appreciated.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.