Documents

Lambda でLaravelを動かしてみるときの環境構築


 サーバーレス環境でLaravelを動かしてみるチュートリアル的なものになります。Lambdaについてはもう皆さんいろいろ知っているかと思うので概ね割愛します。概ねアホみたいに大きなリクエストとレスポンスではない限りLambdaは最高のパフォーマンスを発揮します。LaravelとLambdaの相性もかなり進化してよりよくなっているようです。
 Laravel自体がsailというDockerコマンド的なものを持つようになったのと、それらが直接デプロイイメージとなるようで、ここらはかなり楽になったかなという感じです。基本的にはLaravelのプロジェクトとbreafでいけちゃう感じがします。
 AWSにも公式ページっぽいものがあります。
サーバーレス LAMP スタック – Part4: サーバーレスLaravelアプリの構築

Laravelでの環境構築の手順

  1. Laravelのインストール

    $ curl -s https://laravel.build/larademo | bash

     Laravelのイメージをまるごと落としてきます。結構時間かかります。larademoの部分はプロジェクトに合わせて好きな文字列でOKです。ディレクトリ名になります。
     途中でパスワードを求められますので、PCのadminのパスワードを入力します。

  2. Composerのインストール
     普通にcomposerの設定をしておけば問題なしです。
    https://getcomposer.org/download/

    $ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    $ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    $ php composer-setup.php
    $ php -r "unlink('composer-setup.php');"

     私は個人的にcompsoerはlocalでそれぞれ持たせるようにしています。composerのバージョンによって動いたり動かなかったりする案件があるので。(Globalで設定してある人は、そのまま使えるのでインストール不要)
    composerでupdateしておきます。

    $ php composer.phar update

    dockerで起動します。

    $ docker-compose up -d

     エラーが出ときは、いろいろ原因があるので、ひとつひとつ潰してゆく感じになると思います。すでに既存のLaravelのDockerが起動しているとhttpのポートが重なるので、別のものにしておく必要があります。docker-compose.ymlを開いて編集しておきます。Macの場合は利用中のポートを確認しておくとよいと思います。

    $ sudo lsof -i -P | grep "LISTEN"

     portの変更をします。いろいろ被っている場合は、全部別のものにするか、起動中のポートを停止してください。

    // docker-compose.yml
    ...
    ports:
    - '${APP_PORT:-6640}:80'
    - '${HMR_PORT:-6641}:8080'
    ...

    起動します。

    $ docker-compose up -d
    $ docker-compose ps
    lambda_laravel_laravel.test_1   start-container                  Up                      0.0.0.0:6640->80/tcp, 8000/tcp, 0.0.0.0:6641->8080/tcp
    lambda_laravel_mailhog_1        MailHog                          Up                      0.0.0.0:1026->1025/tcp, 0.0.0.0:8026->8025/tcp        
    lambda_laravel_meilisearch_1    tini -- /bin/sh -c ./meili ...   Up (unhealthy)          0.0.0.0:7701->7700/tcp                                
    lambda_laravel_mysql_1          /entrypoint.sh mysqld            Up (health: starting)   0.0.0.0:330->3306/tcp, 33060/tcp, 33061/tcp           
    lambda_laravel_redis_1          docker-entrypoint.sh redis ...   Up (healthy)            0.0.0.0:6380->6379/tcp                                
    lambda_laravel_selenium_1       /opt/bin/entry_point.sh          Up                      4444/tcp, 5900/tcp     

これで起動できました。http://localhost:6640/ にアクセスしてLaravelの初期画面が出てきたらOKです。

Serverless用にLaravelの準備をする

Serverless用のライブラリbrefをインストールします。これは「Bref is a framework to write and deploy serverless PHP applications on AWS Lambda.」ってことなので、こういうものだと思います。

$ ./vendor/bin/sail composer require bref/bref bref/laravel-bridge

ServerlessようにDockerファイルを修正するので、Dockerファイルをpublishします。

./vendor/bin/sail php artisan vendor:publish --tag=serverless-config

serverless-config.ymlというファイルが作成されます。これを後から編集してLambdaにデプロイできるようにします。

AWSのアクセスキーの作成

AWSアクセスキーの作成を参考にして作成してください。IAMで新規ユーザーを作成してAdmin権限を与えてキーを発行するという手続きになります。どこかしらで見かけたのですが、開発発展中の機能なので適切な権限付与ができないのでフルパーミッションでごめんね。扱いには十分気をつけてね、というようなことがAWSのどこかのページに書いてました。



例では、

  1. AWSダッシュボードで、IAMに移動し、新しいユーザーを作成します。
  2. ユーザー名(「bref-cli」など)を設定し、プログラムによるアクセスを有効にして、次の画面に移動します。
  3. [既存のポリシーを直接添付する]をクリックし、 AdministratorAccessを検索して選択します。
  4. ユーザーの作成を完了し、生成されたAWSアクセスキーをメモします。

こういったものが入手できれば完了です。

user name: bref-cli
access key ID: AK******************
secret access key: dq**************************************

Serverless コマンドのインストール

$ npm install -g serverless

npmですぐにインストールできるわけですが、開発環境が込み入っている場合はnode.jsのバージョンとかもいろいろあるので、私個人はanyenvでローカルに個別にインストールするようにしています。anyenv + nodenv で指定バージョンのnode.jsを使うあたりを参考にしてください。ローカルに個別でインストールする場合は-gなしでインストールします。

$ npm install serverless

インストールが終わったら、バージョンを確認してみます。

% serverless -v
Running "serverless" from node_modules
Framework Core: 3.19.0 (local) 3.19.0 (global)
Plugin: 6.2.2
SDK: 4.3.2

こんな感じで起動できればOKです。
serverlessのインストールは様々な方法でできます。npmに含まれているので、npmでインストールするのがもっとも最速だと思いますが、Setting Up Serverless Framework With AWSといったページもありcurlなどでインストールも可能です。




2022.06.07