Lambda не может найти файл, когда версия кода вставлена ​​в свойство Handler в шаблоне CloudFormation - PullRequest
0 голосов
/ 16 февраля 2020

Артефакт, который я создаю и разворачиваю, содержит номер версии. Он имеет вид:

universe-0.0.1-SNAPSHOT.zip

, где 0.0.1-SNAPSHOT - версия.

Теперь шаблон CloudFormation имеет обработчик, сопоставленный через функцию Fn :: Join:

  UFunctionCelestial:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        S3Bucket: !Ref ArtefactRepositoryBucket
        S3Key: !Join [ '', [!Sub '${AWS::StackName}-', !Ref CodeVersion, '.zip' ] ]
      Handler: !Join [ '', [!Sub '${AWS::StackName}-', !Ref CodeVersion, '/src/lambdas/celestial_persist_function.handler'] ]
      Role: !GetAtt [ UIAMRoleFunctionServiceRoleCelestial, Arn ]
      Runtime: python3.7
      Environment:
        Variables:
          CELESTIAL_TABLE_NAME: !Ref UTableCelestial
          PRIMARY_KEY: id
    DependsOn:
      - UIAMRoleFunctionServiceRolePolicyCelestial
      - UIAMRoleFunctionServiceRoleCelestial

...SNIP...

Parameters:
  ArtefactRepositoryBucket:
    Type: String
    Description: S3 bucket for asset "foundry-cdk/CelestialHandler/Code"
  CodeVersion:
    Type: String
    Description: S3 key for asset version "foundry-cdk/CelestialHandler/Code"

Я думаю, что большая часть этого не имеет значения, за исключением свойства Handler

Теперь версия кода !Ref CodeVersion для этой строки, по некоторым причинам, оценивается как 0/0/1-SNAPSHOT, хотя я и вызываю этот шаблон с командой:

aws2 cloudformation deploy \
    --template-file ${CF_TEMPLATE_FILE} \
    --region ${ACCOUNT_REGION} \
    --stack-name ${PROJECT_NAME} \
    --force-upload \
    --capabilities CAPABILITY_IAM \
    --parameter-overrides \
        ArtefactRepositoryBucket=${S3_AWS_RELEASES_BUCKET} \
        CodeVersion=${APPLICATION_VERSION}

Я повторил ${APPLICATION_VERSION} и, да, он оценивается в 0.0.1-SNAPSHOT

и все же, когда я go на консоль и посмотреть на моей лямбде я получаю сообщение:

лямбда не может найти файл юниверс-0/0/1-SNAPSHOT / src / lambdas / celestial_persist_function.py. Убедитесь, что ваш обработчик поддерживает формат: file-name.method.

Итак, мой вопрос: почему CloudFormation превращает мои точки в косые черты и дает лямбда-ссылку задницу?

1 Ответ

1 голос
/ 17 февраля 2020

Дело не в облачной информации. Поведение, которое вы видите, является нормальным поведением.

Обычно, когда вы определяете обработчик как "folder1.folder2.file.handler", он будет искать folder1, затем искать folder2 внутри этого, затем искать файл file.py внутри. Наконец, ожидается, что file.py будет иметь функцию с именем handler.

Я предполагаю, что в вашем zip-файле есть верхняя папка с именем src. В этом случае ваш обработчик должен быть определен как src.lambdas.celestial_persist_function.handler, так как вы уже упомянули, где ваш zip-файл использует S3Key.

, надеюсь, это поможет.

...