首页 > 解决方案 > Localstack:函数已经存在/ResourceConflictException

问题描述

我部署到在 Docker 中运行的 localstack(通过 进行部署serverless-localstack)每次都失败。使用 0.11.1 版本,它在 3-5 次尝试后工作(没有更改任何内容),并且使用最新版本,将整个堆栈部署到 localstack 没有任何变化。我的 localstack docker 镜像是最新的。

当其余的被注释掉时,单独部署一个或两个函数是可行的。即使我将所有函数的处理程序更改为像一些无服务器示例中的简单处理程序,它也可以工作。因此,随着包大小的增加,错误似乎出现了。

我的第一个猜测是部署时会出现一些超时,因为完整的包大小对于八个功能来说相对较大,并且部署需要很长时间。另一个观察:当错误出现时,有 1-2 个函数和资源/流已经部署但无法访问。试图为 docker 提供更多资源,但这也无济于事。

来自本地堆栈的错误:

Running CloudFormation stack deployment loop iteration 1
localstack_1        | 2020-05-30T20:31:40:DEBUG:localstack.services.cloudformation.cloudformation_starter: Currently processing stack resource api-dev-dev/GraphQLMainHandlerLambdaVersionOcnwJH5Fo772wd6pU0oM5FhOPeqfRUzVOcuaYd1Oizk: None
localstack_1        | 2020-05-30T20:31:40:DEBUG:localstack.services.cloudformation.cloudformation_starter: Currently processing stack resource api-dev-dev/GraphQLMainHandlerLambdaFunction: True
localstack_1        | 2020-05-30T20:31:40:ERROR:localstack.services.cloudformation.cloudformation_starter: Unable to parse and create resource "GraphQLMainHandlerLambdaVersionOcnwJH5Fo772wd6pU0oM5FhOPeqfRUzVOcuaYd1Oizk": 'FunctionName' Traceback (most recent call last):


Unable to parse and create resource "GraphQLMainHandlerLambdaFunction": An error occurred (ResourceConflictException) when calling the CreateFunction operation: Function already exist: api-dev-dev-graphQLMainHandler Traceback (most recent call last)
...
botocore.errorfactory.ResourceConflictException: An error occurred (ResourceConflictException) when calling the CreateFunction operation: Function already exist: api-dev-dev-graphQLMainHandler

+还有更多出于相同的原因。

无服务器.yaml:

service:
  name: api-${self:provider.stage}

provider:
  name: aws
  runtime: nodejs12.x
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'eu-central-1'}
  profile: dev-local
  environment:
    STAGE: ${self:provider.stage}
    MAIN_TABLE_NAME: ${self:custom.mainTableName}
    MAIN_BUCKET_NAME: ${self:custom.mainBucketName}
    #MAIN_TABLE_STREAM_ARN:
      #Fn::GetAtt:
        #- MainTable
        #- StreamArn
    #DYNAMODB_REGION: ${self:provider.region}
    #AWS_PROFILE: ${self:provider.profile}
    AWS_REGION: ${self:provider.region}

package:
  include:
    - src/**

functions:
 graphQLMainHandler:
   handler: src/handler/graphQLMainHandler.graphQLMainHandler
   events:
     - http:
         method: post
         path: graphql-main
         cors: true
 dynamoDBStreamHandler:
   handler: src/handler/dynamoDBStreamHandler.dynamoDBStreamHandler
   events:
     - stream:
         type: dynamodb
         arn:
           Fn::GetAtt:
             - MainTable
             - StreamArn
         batchSize: 10
         startingPosition: TRIM_HORIZON
 pictureHandler:
   handler: src/handler/pictureHandler.pictureHandler
   events:
     - http:
         method: get
         path: picture
         cors: true
 taskHandler:
   handler: src/handler/taskHandler.taskHandler
 updateMainTableElasticsearchMappings:
   handler: src/handler/dev.updateMainTableElasticsearchMappings
 createMainTableElasticsearchIndex:
   handler: src/handler/dev.createMainTableElasticsearchIndex
 analysisTaskRunner:
   handler: src/handler/taskRunner.analysisTaskRunner
 sendNotificationsTaskRunner:
   handler: src/handler/taskRunner.sendNotificationsTaskRunner

plugins:
  - serverless-webpack
  - serverless-localstack
  - serverless-offline
resources:
  Resources:
    MainTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:custom.mainTableName}
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST
        StreamSpecification:
          StreamViewType: NEW_IMAGE
    MainBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.mainBucketName}
        AccessControl: PublicRead
        CorsConfiguration:
          CorsRules:
            - AllowedMethods:
                - GET
              AllowedOrigins:
                - "*"
              AllowedHeaders:
                - "*"

custom:
  serverless-offline:
    host: 0.0.0.0
    port: 3000
  webpack:
    packager: yarn
    webpackConfig: ./webpack.config.js
    includeModules: true
  localstack:
    debug: true
    stages:
      - dev
    autostart: false
    #lambda:
      #mountCode: false

  mainTableName: main-${self:provider.stage}
  mainBucketName: main-${self:provider.stage}

码头工人-compose.dev.yml:

version: '3'
services:
  localstack:
    privileged: true
    image: localstack/localstack
    environment:
      - EDGE_PORT=4566
      - DEFAULT_REGION=eu-central-1
      - AWS_DEFAULT_REGION=eu-central-1
      - DEBUG=1
      - COMPOSE_PARALLEL_LIMIT=100
      - LAMBDA_EXECUTOR=docker-reuse
      - DOCKER_HOST=unix:///var/run/docker.sock
      - USE_SSL=1
    volumes:
      - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
    ports:
      - "4566-4599:4566-4599"

(...)

标签: amazon-web-servicesdockeraws-lambdadocker-composelocalstack

解决方案


推荐阅读