今回はGo言語で作成した自作のお問い合わせメールAPIを、EC2からログアウトした後でも デーモン によってmain.goが実行され続けるようにします。つまりパソコンを閉じてもgo run main.goの処理が止まらないようにします。
前回、EC2環境で実行させることでAPIがインターネットにつながり、ようやくWebAPIが実用的なものになったと思われました。
しかし実際やってみると、EC2でコマンド「go run main.go」によってAPIは動作したのですが、EC2をログアウトすると実行も途切れてしまいました。これでは実用的とは言えません。
デーモン とは
そこで必要になるのがデーモンです。
デーモンという名前ですが、怖いものではありません。
デーモンとは、バックグラウンドで実行処理をしてくれるおかげで、パソコンを閉じてもEC2のインスタンスが実行状態である限り実行ファイルの実行が途切れなくなるプログラムです。
そしてデーモン状態に切り替えることをデーモン化と言います。
EC2環境でAPIが動作することが前提です。EC2での動作方法はこちらの記事をご覧ください。
手順
さて手順ですが、あまり難しくありません。
まずコマンドプロンプトからEC2環境に入ります。
ssh -i .ssh/tokumemo-key.pem ec2-user@xxx.xxx.xxx.xxx
.ssh/tokumemo-key.pemには作成したSSHキーのファイルパス、xxx.xxx.xxx.xxxにはインスタンスのパブリックIPアドレスを入れます。詳しくは前回の記事を参照してください。
次に実行ファイルを生成します。
go build main.go
見た目では分かりませんが、これでmain.goからmainという実行ファイルを生成しました。
そしてデーモン化の設定ファイルを作成して編集します。
sudo vi /etc/systemd/system/適当な名前.service
デーモン化するプログラムに適当な名前をつけて新規ファイルを作成します。
一応ですが、viコマンドによるファイル編集では「i」を押すと入力モードになり、「Esc」を押すとコマンドモードに戻ります。
コマンドモードにおいて「:wq」からのEnterで保存してファイルを閉じます。
以下のようにファイルを編集します。
[Unit]
Description=適当な説明
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/ec2-user/go_sendEmail
ExecStart=/home/ec2-user/go_sendEmail/main
Restart = always
[Install]
WantedBy=multi-user.target
上記のWorkingDirectoryは、実行したいmain.goが入っているフォルダパスを指定します。(筆者はgo_sendEmail)
ExecStartはそのフォルダの実行ファイルとなる「main」を指定します。(main.goではありません。)
そして以下のコマンドを順に打っていきます。
まず設定ファイルの読み込み
sudo systemctl daemon-reload
次にサービスの自動起動を有効化
sudo systemctl enable 適当な名前.service
してサービスを起動
sudo systemctl start 適当な名前.service
サービスの状態を確認します。
sudo systemctl status 適当な名前.service
これでエラーが起きていなければ成功です。
デーモン プログラム再起動の注意点
デーモンでプログラムを起動させた後に、もしファイルの変更をした場合にしないといけないことがあります。
それは、サービスの再起動です。
ここで注意なのが、サービスの再起動は
sudo systemctl restart 適当な名前.service
で行います。restartになっていることに注意です。(私はここで、startでずっと再起動しようとしていたため手こずりました。)
デーモン化の設定ファイル(適当な名前.service)を変更した場合は、再起動の前に
sudo systemctl daemon-reload
も実行する必要があります。
デーモン 確認
これでexitコマンドなりコマンドプロンプトを閉じるなり、EC2からログアウトしてからAPIを実行させてみて、ちゃんと動作すればデーモン化成功です。