先月 AWS App Runner という新サービスがリリースされました。
📣 新サービス #AWSAppRunner のローンチです!🚀
— Tori Hara (@toricls) May 18, 2021
\数クリックでソースコードやコンテナイメージをデプロイ!/
AWS Fargate より高い抽象度、あるいは AWS Lambda のようなスレッドではなくプロセスそのものを実行したかった方にぜひお試しいただきたいサービスです!1/nhttps://t.co/LPFNOP7CBT
既にたくさんのデプロイしてみた系の記事が公開されていますが、流石に(残念ながら?) Perl をデプロイしている人はいないですよね? と言うわけで、ネタがかぶらないよう Perl でやってみましょう。
ソースコードは shogo82148/perl-on-aws-app-runner においてあります。
2022-02-13追加
NEW!! VPC への接続がサポートされ RDS へもつながるようになりました!!!
PSGI アプリを用意する
Wikipedia の PSGI のページに書いてあった例をそのまま使います。
# app.psgi
my $app = sub {
return [200, ['Content-Type' => 'text/plain'], ["hello, world\n"]];
}
Dockerfile を用意する
PSGI アプリを起動するのに Plack を使用するので、 cpanfile に Plack への依存を書いておきます。
# cpanfile
requires 'Plack';
Perl の公式イメージをベースに、依存モジュールをインストールしてplackupするだけの 簡単な Dockerfile を書きます。
# Dockerfile
FROM perl:5.34.0
WORKDIR /usr/src/myapp
COPY cpanfile .
RUN cpanm --notest --installdeps .
COPY app.psgi .
CMD [ "plackup", "app.psgi" ]
さて、一応ちゃんと動作するか手元で確認しておきましょう。 デフォルトで 5000 番ポートで立ち上がるので、ポートバインディングの設定をして、起動してみます。
$ docker build -t perl-test .
$ docker run -p 5000:5000 perl-test
HTTP::Server::PSGI: Accepting connections at http://0:5000/
“http://localhost:5000” にアクセスすると “hello, world” と表示されるはずです。
ECR に Push する
マネージメントコンソールで Amazon ECR を開いて 新規レポジトリを作成、イメージをプッシュします。 レポジトリを作成するとプッシュの手順が表示されるので、それにしたがいましょう。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t perl-test .
docker tag perl-test:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/perl-test:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/perl-test:latest
AWS App Runner でサービスを作成する
マネージメントコンソールで AWS App Runner を開いて 新しいサービスを作成します。 特に Container image URI に先程作成したイメージを指定するのと、ポート番号が 5000 番なことに注意しましょう。
- Source
- Repository type: Container registry
- Provider: Amazon ECR
- Container image URI:
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/perl-test:latest
- Deployment settings
- Deployment trigger: Automatic
- ECR access role: Create new service role (or “Use existing service role” if you have already created it)
- Service settings:
- Service name: perl-test
- Virtual CPU & memory: 1vCPU & 2GB
- Port: 5000
5 分ほど待っていると https://xxxxxxxx.ap-northeast-1.awsapprunner.com/
のような URL が利用可能になります。
まとめ
特にハマることもなく簡単にできました。 Docker イメージさえ作ってしまえば、何回かポチポチするだけで公開できるので楽ちんですね。
唯一の問題は App Runner 自体は永続化層を持たないと言うことでしょうか・・・。 個人的には RDS for MySQL を使いたいところですが、VPC の設定をいじって直接接続できないので一工夫必要です。 AWS の中の人的には「DynamoDB を使え」ということなんでしょう。