今や古めの人間になってしまった。定期的に実行したいスクリプトはサーバにアップロードして cron を設定して実行している。しかもアップロードは手動だ。あまりにも時代に追いつけていなさすぎるので何としてでも改善したい。
目指すのは、ローカル環境でコードを書いて確認できたら GitHub のレポジトリに push する。特定のブランチにマージされたら、(ビルドして)実行環境であるサーバの任意の場所に自動的にアップロードされる状態 …というか仕事ではすでに運用しているし、プライベートもちゃんとしようって話。Deploying to a server via SSH and Rsync in a Github Action を参考にして作業を進めていく。
作業手順
GitHub からデプロイ先に SSH できるようにする
デプロイ先のサーバで ssh-keygen を使って鍵を作成して GitHub に登録する。.ssh ディレクトリで次のコマンドを実行。
ssh-keygen -t rsa -b 4096 -C "email_address@example.com"
- ファイル名は適当なものを設定
- パスフレーズは指定せず空のままエンターを押す
randomart image が表示され、ディレクトリ配下に指定したファイル名の秘密鍵と .pub
の拡張子がついた公開鍵が作成されていればOK。
GitHub リポジトリに作成した鍵を Settings
– Secrets and variables
– Actions
– New repository secret
から登録。
rsync コマンドを使えるようにする
rysnc を使ってデプロイしたいのだが、rsync を使うには両サーバに rsync がインストールされている必要がある。GitHub Actions では ubuntu-latest を使う場合デフォルトでインストールされているので問題ない。
デプロイ先の自分のサーバで未インストールの場合はインストールしておく。
workflow の作成
yaml ファイルを作成する。と言ってもリポジトリをチェックアウトしてきて ssh で rsync するだけならやることはほぼ決まっているので参考リンクのソースコードから必要なものをコピペして作った。
まとめと今後の展望
ここまでの設定で、指定のブランチにマージされたらデプロイできるようになった。圧倒的に便利である。
このあとはアプリケーション内の環境変数を AWS を参照するように変更したい。さらに言えばサーバ上の cron で動かすのをやめて AWS Lambda を使えるようにしたいと思う。
- 環境変数を AWS System Manager Parameter Store で実現する
- AWS Lambda に移行する
- 【Python3】コマンドラインから簡単にAWS lambdaに関数をアップロード出来ちゃう「lambda-uploader」のインストール方法と使い方【手順まとめ】
- : Lambda を使う場合は Lambda 上で環境変数を設定できる
- AWS Lambdaで定期処理を実行するためのRateとCronの設定: Lambda ではスケジュールの設定に cron だけでなく rate も使えるし、とてもシンプル