'aws cloud9 lambda import failed

I have a working production environment with several Lambda deployed from my PC using AWS SAM.

I want to transition my lambda to Cloud9 and debug from there but...

Some of the functions import well and I can run the debugger while others don't even show up after importing. This leads me to believe there might be a config issue that Cloud9 doesn't like.

I'll take a fairly simple lambda called uploaddirect and this is what it looks like:

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: add docs directly from s3

Parameters:

  Environment:
    Type: String
    Default: staging
  DocumentMetadataBucketName:
    Type: String
  DocumentSourceBucketName:
    Type: String
  DocumentMetadataBucketArn:
    Type: String
  DocumentSourceBucketArn:
    Type: String

Resources:
  UploaddirectFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Sub leopro-uploaddirect-function-${Environment}
      Handler: uploaddirect.handler
      Runtime: nodejs10.x
      Timeout: 300
      Role: !GetAtt UploaddirectExecutionRole.Arn
      Environment:
        Variables:
          DOCUMENT_METADATA_BUCKET: !Ref DocumentMetadataBucketName
          DOCUMENT_SOURCE_BUCKET: !Ref DocumentSourceBucketName
      CodeUri: .

  UploaddirectExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub leopro-uploaddirect-exec-role-${Environment}
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
      Policies:
        -
          PolicyName: !Sub leopro-uploaddirect-access-s3-${Environment}
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action:
                  - "s3:GetObject"
                  - "s3:PutObject"
                Resource: 'arn:aws:s3:::*/*'
            Statement:
              -
                Effect: "Allow"
                Action:
                  - "s3:*"
                Resource: '*'
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"

  UploaddirectBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub leopro-uploaddirect-dropbox-bucket-${Environment}
      NotificationConfiguration:
        LambdaConfigurations:
          -
            Event: 's3:ObjectCreated:*'
            Function: !GetAtt UploaddirectFunction.Arn

  UploaddirectBucketPolicy:
      Type: AWS::S3::BucketPolicy
      Properties:
        Bucket: !Ref UploaddirectBucket
        PolicyDocument:
          Statement:
            -
              Action:
                - "s3:GetObject"
              Effect: "Allow"
              Resource: !Sub "arn:aws:s3:::leopro-uploaddirect-dropbox-bucket-${Environment}/*"
              Principal: "*"

  InvokeFromS3Permission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt UploaddirectFunction.Arn
      Action: "lambda:InvokeFunction"
      Principal: "s3.amazonaws.com"
      SourceArn: !Join [ "", [ "arn:aws:s3:::", !Sub "leopro-uploaddirect-dropbox-bucket-${Environment}" ] ]

I tried plenty of things including changing the function name, redeploying, clearing my cache, restarting cloud9, deleting folders ...

Any ideas?



Solution 1:[1]

The naming conventions of functions can be a problem when importing, specially if there are conditional parameters.

The way I solved it was to create another project with exactly same settings and code (diff compare) and changed the names of the stack, the app, the functions and the policies.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1