16
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

fly.ioの「Deploy Your Application via Dockerfile」を試してみる(Bolt for Pythonを使ったSlackアプリ)

Last updated at Posted at 2022-02-19

秋の田のかりほの庵の苫を荒みわがころも手は露に濡れつつ

Advent Calendar 2022 50日目1の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


はじめに

fly.ioの話を書きます。
はじめて使ってみました。

ちょっと変わり種? の
Deploy Your Application via Dockerfile」の例を示します。

What's fly.io ?

Run your full stack apps (and databases!) all over the world. No ops required.

PaaSに分類されるサービスだとおもいます。
軽く使ってみたくらいですが、使いやすいです。
Phoenixアプリとの相性が抜群によさそうです。

Phoenixアプリをデプロイする例

@koga1020 さんの記事をオススメしておきます。


Deploy Your Application via Dockerfile

題材はPythonを使ったSlackアプリにします。

Bolt 入門ガイド」で紹介されているプログラムをそのまま使います。
Slack側の設定は、Bolt 入門ガイドの通りに設定しているものとします。

ソースコード

以下を用意します。
こちらのPythonのプログラムは、Slackアプリが追加されたチャンネルでhelloという文字列を含む書き込みがされると、Hey there <@投稿者> !というふうに挨拶を返してくれるbotです。
Bolt 入門ガイド」の通りのソースコードです。

app.py
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

# ボットトークンとソケットモードハンドラーを使ってアプリを初期化します
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

# 'hello' を含むメッセージをリッスンします
# 指定可能なリスナーのメソッド引数の一覧は以下のモジュールドキュメントを参考にしてください:
# https://slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html
@app.message("hello")
def message_hello(message, say):
    # イベントがトリガーされたチャンネルへ say() でメッセージを送信します
    say(f"Hey there <@{message['user']}>!")

# アプリを起動します
if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

同じフォルダにDockerfileを用意します。

Dockerfile
FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./app.py" ]

アカウント作成

私は、 https://fly.io/ サイト上でつくりました。
GitHubアカウントで連携しました。

Installing flyctl

に従って、インストールをしてflyctlコマンドが使えるようにします。

flyctlコマンドでの操作

flyctlコマンドで操作していきます。

ログイン

まずはログインします。

$ flyctl auth login 

初期設定

$ flyctl launch

? Overwrite "/Users/awesome/first-bolt-app/Dockerfile"? (y/N) にはNを答えます。
? Would you like to setup a Postgresql database now?にはNを答えます。
そのほかの設問は、デフォルトのままエンターでよいでしょう。
お好みで変更してください。
以下のようなfly.tomlファイルが自動的につくられます。

fly.toml
# fly.toml file generated for rough-paper-5532 on 2022-02-19T23:03:26+09:00

app = "rough-paper-5532"

kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[env]
  PORT = "8080"

[experimental]
  allowed_public_ports = []
  auto_rollback = true

[[services]]
  http_checks = []
  internal_port = 8080
  processes = ["app"]
  protocol = "tcp"
  script_checks = []

  [services.concurrency]
    hard_limit = 25
    soft_limit = 20
    type = "connections"

  [[services.ports]]
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

  [[services.tcp_checks]]
    grace_period = "1s"
    interval = "15s"
    restart_limit = 0
    timeout = "2s"

[[statics]]
  guest_path = "/app/public"
  url_prefix = "/static/"

このアプリでは、ソケットモードで動作させますので不要な設定は消しておきます。
これをしないと、次回のデプロイ時にヘルスチェックに引っかかるなどして、新しいほうがうまくデプロイされないなどの動きになります。

fly.toml
# fly.toml file generated for rough-paper-5532 on 2022-02-19T23:03:26+09:00

app = "rough-paper-5532"

kill_signal = "SIGINT"
kill_timeout = 5
processes = []

環境変数の設定

環境変数を2つ設定しておきます。

  • SLACK_BOT_TOKEN
  • SLACK_APP_TOKEN

それぞれの環境変数の意味は、「Bolt 入門ガイド」をご参照ください。
このアプリ特有の環境変数です。

$ flyctl --app rough-paper-5532 secrets set SLACK_BOT_TOKEN="xoxb-xxx"
$ flyctl --app rough-paper-5532 secrets set SLACK_APP_TOKEN="xapp-xxx"

--app rough-paper-5532の部分は、ご自身のアプリ名で置き換えてください。

deploy :rocket:

いよいよデプロイタイムです。
Dockerをローカルで動かしておいてください。

If you have Docker running locally, it builds it on your machine. If not, it builds it on a Fly build machine.

ローカルマシンでビルドして、fly.ioにイメージをPushしているとのことです。

$ flyctl deploy --detach

--detachフラグの意味は

Return immediately instead of monitoring deployment progress

です。
ヘルプは、flyctl deploy --helpで確認できます。


Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

fly.ioのドキュメントの中から、ちょっと変わり種? の「Deploy Your Application via Dockerfile」の例を示しました。
今回はPythonで作ったSlackアプリにしましたが、ElixirBanditを利用して作ったSlackアプリ、LINEアプリを同じ要領で動かせるとおもいます。
今後やってみます。

追伸

以下は、ハマったこととしてそのまま残しておきます。

すでにfly.tomlを書き換えることで解決することは確認しておりまして、記事本文には反映済みです。

app.pyを変更して、flyctl deployすると変更内容がfly.ioに飛んでいるのですが、以下の挙動を確認しました。

  • たまに古いDockerコンテナのほうがまだ動いている
  • しばらくそのまま待っていると、新しいDockerコンテナのほうが完全に止まって、古いDockerコンテナのほうの動きをする
$ flyctl status

Instances
ID      	PROCESS	VERSION	REGION	DESIRED	STATUS 	HEALTH CHECKS      	RESTARTS	CREATED   
dccb1dc2	app    	6 ⇡    	sin(B)	run    	running	1 total, 1 critical	0       	2m31s ago	
3af1fa4b	app    	2      	nrt   	run    	running	1 total, 1 critical	1       	35m8s ago

一時的に新らしいコンテナと古いコンテナが動いているようです。
VERSION 6のほうに切り替わってくれればいいのですが、このまましばらく待つと、VERSION 6がいなくなります。

回避策は、適当な環境変数を追加することです。

$ flyctl --app rough-paper-5532 secrets set HOGE="hoge"

一応、これで最新のほうの動きに寄りました :tada::tada::tada:

追伸の追伸 ーー Troubleshooting your Deployment

Troubleshooting your Deploymentを読んでみました。
なんとなくですが、ヘルスチェックに引っかかって新しいほうが停止されていたようです。
このアプリはhttp(s)は使っていないので不要な設定をfly.tomlから消しておきます。
これで、fly deployで最新内容がうまくデプロイされるようになりました。

fly.toml
# fly.toml file generated for rough-paper-5532 on 2022-02-19T23:03:26+09:00

app = "rough-paper-5532"

kill_signal = "SIGINT"
kill_timeout = 5
processes = []

ヨシヨシ、知見がたまった。


  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

16
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?