【问题标题】:Why Bref cannot load bootstrap: "Error: Couldn't find valid bootstrap(s): [/var/task/bootstrap /opt/bootstrap]"?为什么 Bref 无法加载引导程序:“错误:找不到有效的引导程序:[/var/task/bootstrap /opt/bootstrap]”?
【发布时间】:2020-05-17 01:32:42
【问题描述】:

我正在研究如何使用 bref 库在 php 中创建 AWS lambda

因此,根据documentation,我使用以下命令鸡尾酒设置环境:

sudo -H npm install -g serverless
composer require bref/bref

然后使用以下命令创建了我的第一个 php lambda:

 vendor/bin/bref init

我选择了默认提供的第一个选项PHP Function。创建以下创建index.php 文件:

declare(strict_types=1);

require __DIR__.'/vendor/autoload.php';

lambda(function ($event) {
    return 'Hello ' . ($event['name'] ?? 'world');
});

然后我把我的serverless.yml改成那个:

service: app

provider:
    name: aws
    region: eu-central-1
    runtime: provided
    stage: ${opt:stage,'local'}

package:
    exclude:
        - '.gitignore'

plugins:
    - ./vendor/bref/bref

functions:
    dummy:
        handler: index.php
        name: Dummy-${self:provider.stage}
        description: 'Dummy Lambda'
        layers:
            - ${bref:layer.php-73}

我尝试通过以下命令启动它:

sls invoke local --stage=local --docker --function dummy

但我收到以下错误:

{"errorType":"exitError","errorMessage":"RequestId: 6403ebee-13b6-179f-78cb-41cb2f517460 Error: Couldn't find valid bootstrap(s): [/var/task/bootstrap /opt/bootstrap]"}

因此,我想问一下为什么我无法本地运行我的 lambda?

【问题讨论】:

    标签: php lambda serverless bref


    【解决方案1】:

    bref 是已知的bug。它可以通过在serverless.yml 中的函数上手动提供层来解决。所以 serverless.yml 的 functions 部分应该从:

    functions:
        dummy:
            handler: index.php
            name: Dummy-${self:provider.stage}
            description: 'Dummy Lambda'
            layers:
                - ${bref:layer.php-73}
    

    进入:

    functions:
        dummy:
            handler: index.php
            name: Dummy-${self:provider.stage}
            description: 'Dummy Lambda'
            layers:
                - 'arn:aws:lambda:eu-central-1:209497400698:layer:php-73:15'
    

    原因是${bref:layer.php-73}无法解析成php层。因此,您需要手动为 lambda 层提供 arn。

    请记住,arn 有各种“版本”,这些“版本”是从arn 中的最后一个数字开始的,用: 分隔。所以在arn中

    arn:aws:lambda:eu-central-1:209497400698:layer:php-73:15
    

    表示该层的版本为“15”,而这在回答的那一刻是最新的。下一个逻辑上应该是:

    arn:aws:lambda:eu-central-1:209497400698:layer:php-73:16
    

    【讨论】:

    【解决方案2】:

    由于这个问题获得了很多意见,我建议查看 Bref 文档:

    Local development for PHP functions

    这涉及使用bref local CLI 命令而不是serverless invoke local

    $ vendor/bin/bref local hello
    Hello world
    
    # With JSON event data
    $ vendor/bin/bref local hello '{"name": "Jane"}'
    Hello Jane
    
    # With JSON in a file
    $ vendor/bin/bref local hello --file=event.json
    Hello Jane
    

    【讨论】:

      【解决方案3】:

      在我的本地,在调用 lambda 之前清除缓存工作正常,我使用的是 linux / ubuntu

      docker system prune --all
      sudo apt-get autoremove
      sudo apt-get clean
      sudo apt-get autoclean
      sudo rm -rf ~/.cache/
      sudo rm -rf /var/cache/
      

      【讨论】:

        猜你喜欢
        • 2016-10-22
        • 1970-01-01
        • 2016-10-25
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多