Cloud RunでPhalconをサーバーレスに実行する

GCPのCloud Runを使うとコンテナをFaaSのように呼ばれた時だけ実行することができます。

PHPのマイクロフレームワークPhalconで作ったコードをコンテナに固めて実行してみます。

まずはコンテナを作りましょう。
Cloud Shellで作業します。
$ mkdir phalcon
$ cd phalcon/
以下3ファイルを作成します。
FROM phalconphp/ubuntu-16.04:php-7.2

WORKDIR /app/public
COPY index.php .
WORKDIR /etc/nginx/sites-enabled
COPY nginx.conf default
<?php
use Phalcon\Mvc\Micro;

$app = new Micro();

$app->get(
    "/hello/{name}",
    function ($name) {
        echo json_encode([
            "message" => 'Hello!' . $name,
        ]);
    }
);

$app->notFound(function () use ($app) {
    $app->response->setStatusCode(404, 'Not Found.');
    $app->handle();
});

$app->handle(
    $_SERVER["REQUEST_URI"]
);
server {
    listen 8080 default_server;

    server_name example.com;

    index index.php;
    root /app/public;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass             unix:/run/php/php7.2-fpm.sock;
        fastcgi_index            index.php;

        include                  fastcgi_params;

        fastcgi_param            SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_intercept_errors on;
        fastcgi_read_timeout     300;
        fastcgi_buffer_size      16k;
        fastcgi_buffers          4 16k;
    }
}
8080ポートをリッスンするようにしてるのはCloud Runへのデプロイがこけるからです。

コンテナをビルド、実行します。
「https://8080-521240b2-607a-5167-abb1-a7d2245e6759.asia-east1.cloudshell.dev/hello/phalcon」みたいなURLでCloud ShellからプレビューできればOK。
$ docker build -t phalcon .
~
Successfully tagged phalcon:latest
$ docker run -d --name app -p 8080:8080 -t phalcon
.dockerignoreを作り、Cloud Buildでコンテナイメージをビルドし、Container Registryに格納します。
$ echo Dockerfile > .dockerignore
$ gcloud builds submit --tag gcr.io/$DEVSHELL_PROJECT_ID/phalcon
イメージをCloud Runにデプロイします。
$ gcloud run deploy --image gcr.io/$DEVSHELL_PROJECT_ID/phalcon --platform managed
途中サービス名、リージョンを入力し、未認証の呼び出し許可は「y」にします。

デプロイが成功するとコマンド出力の最後にエンドポイントが表示されるのでアクセスができればOK。
コードを変更するときは再度イメージのビルド、デプロイを行えば反映されます。


コンテナ単体を簡単に公開できるサービスってありそうでなかった感。
ミドルウェア自由にしてちょっとしたアプリ作りたいときに使えそう。