Skip to content

ENOENT: no such file or directory and EPERM: operation not permitted #34

Closed
@CoreyCole

Description

@CoreyCole

I'm on OSX 10.13.6 with Docker version 19.03.1. I've been using serverless for deploying my cloudformation script and now I'm attempting to run my stack locally using serverless-localstack.

I'm running the command

serverless deploy --verbose --stage local

error 1

Serverless: Using serverless-localstack
Serverless: Compiling with Typescript...
Serverless: Using local tsconfig.json
Serverless: Typescript compiled.
Serverless: Skip plugin function Package.packageService (lambda.mountCode flag is enabled)

  Error --------------------------------------------------

  ENOENT: no such file or directory, stat 'xxx/lambdas/.build/.serverless'

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information ---------------------------
     Operating System:          darwin
     Node Version:              8.12.0
     Serverless Version:        1.49.0
     Enterprise Plugin Version: 1.3.5
     Platform SDK Version:      2.1.0

Right after this failure, I try to deploy again using the same command now that there is a .build directory that was created.

error 2 (after running deploy a 2nd time)

Serverless: Using serverless-localstack
Serverless: Compiling with Typescript...
Serverless: Using local tsconfig.json
Serverless: Typescript compiled.

  Error --------------------------------------------------

  EPERM: operation not permitted, unlink 'xxx/lambdas/.build/node_modules'

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information ---------------------------
     Operating System:          darwin
     Node Version:              8.12.0
     Serverless Version:        1.49.0
     Enterprise Plugin Version: 1.3.5
     Platform SDK Version:      2.1.0

If I deploy a 3rd time, or any more, I keep getting error 2.

If I now delete the .build directory and try the deploy command again, I get back to error 1 again, then 2.

serverless.yml
# For full config options, check the docs: https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/
#    docs.serverless.com

service: name

plugins:
- serverless-plugin-typescript
- serverless-iam-roles-per-function
- serverless-localstack

custom:
localstack:
  host: http:://localhost
  stages: # list of stages for which the plugin should be enabled
    - local
  autostart: true # optional - start LocalStack in Docker on Serverless deploy
  endpoints:
    # This section is optional - can be used for customizing the target endpoints
    S3: http://localhost:4572
    DynamoDB: http://localhost:4570
    CloudFormation: http://localhost:4581
    Lambda: http://localhost:4574
  lambda: # Enable this flag to improve performance
    # https://github.com/localstack/serverless-localstack#mounting-lambda-code-for-better-performance
    mountCode: True
  docker: # Enable this flag to run "docker ..." commands as sudo
    sudo: False
serverless-iam-roles-per-function:
  defaultInherit: true
stageEnv: ${opt:stage, self:provider.stage}
dynamoTableName: name-${opt:stage}-Rooms
dynamoTableArn: !Join [ ':', [ 'arn:aws:dynamodb', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'table/${self:custom.dynamoTableName}' ] ]
createServerLambda: !Join [ '-', [ !Ref 'AWS::StackName', 'CreateServer' ] ]
clusterName: !Join [ '-', [ !Ref 'AWS::StackName', 'ServerCluster' ] ]
serverServiceName: !Join ['-', [ !Ref 'AWS::StackName', 'NameServerService' ] ]
serverDockerImage: !Join [ '.', [ !Ref 'AWS::AccountId', 'dkr.ecr.us-west-2.amazonaws.com/name_server:${opt:stage}' ] ]
serverTaskDefinitionName: name-${opt:stage}-NameServerTaskDefinition
serverTaskDefinitionArn: !Join [ ':', [ 'arn:aws:ecs', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'task-definition/${self:custom.serverTaskDefinitionName}' ] ]
fargateSecurityGroupId: !Ref PublicAccessSG
vpcId: vpc-xxx
subnetOneId: subnet-xxx
igwId: igw-xxx
rtbId: !Ref PublicRouteTable

provider:
name: aws
stage: ${opt:stage, 'dev'} # https://serverless.com/framework/docs/providers/aws/guide/variables#recursively-reference-properties
runtime: nodejs10.x
region: us-west-2
memorySize: 256
cfLogs: true
logRetentionInDays: 14
deploymentBucket:
  name: name-deployments
iamRoleStatements: # inherited by all lambda functions
# https://serverless.com/framework/docs/providers/aws/guide/iam/
# https://medium.com/@glicht/serverless-framework-defining-per-function-iam-roles-c678fa09f46d
  - Effect: Allow
    Action:
      - logs:CreateLogGroup
      - logs:CreateLogStream
      - logs:PutLogEvents
    Resource: !Join [ ':', [ 'arn:aws:logs', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'log-group:/aws/lambda/*:*:*' ] ]
  - Effect: Allow
    Action:
      - s3:PutObject
    Resource: arn:aws:s3:::name-deployments
environment:
  stageEnv: ${self:custom.stageEnv}
  dynamoTableName: ${self:custom.dynamoTableName}
  createServerLambda: ${self:custom.createServerLambda}
  clusterName: ${self:custom.clusterName}
  serverTaskDefinitionArn: ${self:custom.serverTaskDefinitionArn}
  fargateSecurityGroupId: ${self:custom.fargateSecurityGroupId}
  subnetOneId: ${self:custom.subnetOneId}

functions:
AddParticipant:
  handler: handlers/AddParticipant.addParticipant
  events:
    - http:
        path: addParticipant
        method: post
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:GetItem
        - dynamodb:Query
      Resource: ${self:custom.dynamoTableArn}
CreateRoom:
  handler: handlers/CreateRoom.createRoom
  events:
    - http:
        path: createRoom
        method: post
  iamRoleStatements:
    - Effect: Allow
      Action:
        - lambda:InvokeFunction
      Resource: !Join [ ':', [ 'arn:aws:lambda', !Ref 'AWS::Region', !Ref 'AWS::AccountId', 'function', '${self:custom.createServerLambda}' ] ]
    - Effect: Allow
      Action:
        - dynamodb:PutItem
        - dynamodb:DeleteItem
        - dynamodb:GetItem
        - dynamodb:Query
        - dynamodb:UpdateItem
      Resource: ${self:custom.dynamoTableArn}
CreateServer:
  handler: handlers/CreateServer.createServer
  events:
    - http:
        path: createServer
        method: post
  iamRoleStatements:
    - Effect: Allow
      Action:
        - ecs:RunTask
      Resource: '*'
    - Effect: Allow
      Action:
        - iam:PassRole
      Resource: '*'
ServerStateChanged:
  handler: handlers/ServerStateChanged.serverStateChanged
  events:
    - cloudwatchEvent: # https://serverless.com/framework/docs/providers/aws/events/cloudwatch-event/
        description: "CloudWatch Event triggered when a server's state changes to Running"
        name: ServerRunning-${opt:stage}
        event:
          source:
            - aws.ecs
          detail-type:
            - 'ECS Task State Change'
          detail:
            clusterArn:
              - !GetAtt 'ECSCluster.Arn'
            lastStatus:
              - RUNNING
            desiredStatus:
              - RUNNING
    - cloudwatchEvent:
        description: "CloudWatch Event triggered when a server's state changes to Stopped"
        name: ServerStopped-${opt:stage}
        event:
          source:
            - aws.ecs
          detail-type:
            - 'ECS Task State Change'
          detail:
            clusterArn:
              - !GetAtt 'ECSCluster.Arn'
            lastStatus:
              - DEPROVISIONING
            desiredStatus:
              - STOPPED
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:PutItem
        - dynamodb:DeleteItem
        - dynamodb:Scan
      Resource: ${self:custom.dynamoTableArn}
    - Effect: Allow
      Action:
        - ec2:DescribeNetworkInterfaces
      Resource: '*'

resources:
Resources:
  # fargate task log group
  NameServerLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Join [ '-', [ /ecs/, !Ref 'AWS::StackName', 'ZServerTaskDefinition' ] ]
  NameServerTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    DependsOn: NameServerLogGroup # make sure the log group is created before it is used.
    Properties:
      # name of the task definition. Subsequent versions of the task definition are grouped together under this name.
      Family: !Join [ '-', [ !Ref 'AWS::StackName', 'NameServerTaskDefinition' ] ]
      # awsvpc is required for Fargate
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - FARGATE
      # 256 (.25 vCPU) - Available memory values: 0.5GB, 1GB, 2GB
      # 512 (.5 vCPU) - Available memory values: 1GB, 2GB, 3GB, 4GB
      # 1024 (1 vCPU) - Available memory values: 2GB, 3GB, 4GB, 5GB, 6GB, 7GB, 8GB
      # 2048 (2 vCPU) - Available memory values: Between 4GB and 16GB in 1GB increments
      # 4096 (4 vCPU) - Available memory values: Between 8GB and 30GB in 1GB increments
      Cpu: 1024
      # 0.5GB, 1GB, 2GB - Available cpu values: 256 (.25 vCPU)
      # 1GB, 2GB, 3GB, 4GB - Available cpu values: 512 (.5 vCPU)
      # 2GB, 3GB, 4GB, 5GB, 6GB, 7GB, 8GB - Available cpu values: 1024 (1 vCPU)
      # Between 4GB and 16GB in 1GB increments - Available cpu values: 2048 (2 vCPU)
      # Between 8GB and 30GB in 1GB increments - Available cpu values: 4096 (4 vCPU)
      Memory: 2GB
      # The ARN of the task execution role that containers in this task can assume. 
      # All containers in this task are granted the permissions that are specified in this role.
      ExecutionRoleArn: !GetAtt 'FargateTaskExecutionRole.Arn'
      ContainerDefinitions:
        - Name: ${self:custom.serverServiceName}
          Image: ${self:custom.serverDockerImage}
          PortMappings:
            - ContainerPort: 3000
          # Send logs to CloudWatch Logs
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-region: !Ref AWS::Region
              awslogs-group: !Ref NameServerLogGroup
              awslogs-stream-prefix: ecs
  # ECS cluster which spins up fargate servers
  ECSCluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: ${self:custom.clusterName}
      Tags:
        - Key: name
          Value: name-serverless-ecs-cluster
  # role for the fargate task itself
  FargateTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Join [ '-', [ !Ref 'AWS::StackName', 'FargateTaskExecutionRole' ] ]
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        # allows fargate task to pull ECR image and write to cloudwatch logs
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
  # security group used by lambda when spinning up a server fargate task (fully open)
  PublicAccessSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to and from the public
      VpcId: ${self:custom.vpcId}
      SecurityGroupIngress:
        # Allow inbound access from anywhere on the internet
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
      SecurityGroupEgress:
        # Allow outbound access from anywhere on the internet
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
      Tags:
        - Key: name
          Value: name-serverless-public-access-security-group

  # DynamoDB
  Rooms:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: ${self:custom.dynamoTableName}
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: roomId
          AttributeType: S
        - AttributeName: ipAddress
          AttributeType: S
      KeySchema:
        - AttributeName: roomId
          KeyType: HASH # partition key (can be multiple for given partition key, i.e. "available")
        - AttributeName: ipAddress
          KeyType: RANGE # sort key (unique & can be "available")

Outputs:
  ECSClusterArn:
    Description: The ARN of the ECS cluster
    Value: !GetAtt 'ECSCluster.Arn'
  FargateTaskDefinitionArn:
    Description: The ARN of the server task definition
    Value: ${self:custom.serverTaskDefinitionArn}
  RoomsDynamoDBTableArn:
    Description: The ARN of the DynamoDB table for managing room IP addresses
    Value: !GetAtt 'Rooms.Arn'
  DockerArn:
    Description: The ARN of the sever docker image
    Value: ${self:custom.serverDockerImage}

I've tried (unsuccssfully) rm -rf node_module/ && npm install --no-bin-links as suggested here

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions