Pandora Pocket

IT系と日常系の備忘録。三日坊主。

Google Compute Engine(無料枠)のLinux上で.NET Coreアプリを定期実行させる

Azure Functionsで動かしていたプログラムがあるんですが、(たぶん実装が悪いのだけど)課金が結構な額となってしまい、またDBを使うとなるとそれはそれでよい金額となってしまいます。

というわけでAzure Functions用に作っていたプログラムを.NET Coreのコンソールアプリとして置き換えて、Google Compute Engine上のLinuxで動かすことにしました。

.NET Coreアプリ展開準備

参考にしたのはid:fnyablog さんの下記の記事。

今回動かすアプリは下記。
.NET Core 2.2のアプリです。

.csprojファイルがあるフォルダでコンソールを呼び出して、

dotnet publish --configuration Release
を実行。

f:id:Ovis:20190128144742p:plain

これで

.\bin\Release\netcoreapp2.2\publish\

のフォルダにNuGetで取得したライブラリのDLLを含めた必要なファイル類が展開されました。

f:id:Ovis:20190128145139p:plain

Linux側の.NET Core SDKの準備

今回GCP側ではUbuntu 18.04LTSを用意しています。

まずUbuntuリポジトリMicrosoftリポジトリを追加

wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

リポジトリが追加されたらapt-getでSDKをインストール。

sudo add-apt-repository universe
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-2.2

最後のdonet-sdk-2.2は、GCEの無償枠だとインストールに相応の時間がかかります。
完了後、dotnetコマンドを叩いてエラーが出なければOK。

以下ログ。

GCEへアプリケーションファイル一式を展開

利用しているターミナルもしくはWinSCPなどを利用してGCP側へファイルをデプロイします。

私の場合はrLoginの「SFTPファイルの転送」機能でデプロイを行いました。
アップロードする分には課金されないはずなので、圧縮も何もせずそのままデプロイ。
f:id:Ovis:20190128175616p:plain

dotnet デプロイしたプロジェクト名.dll

で実行して問題なく動くか要確認。
Windowsで動いてもLinuxで動かないことはあるので。

f:id:Ovis:20190128185118p:plain

Cronを利用して定期実行

作成したアプリは一日に一度動かしたいので、Cronで定期実行させます。
CronTabは-rオプションをうっかり使って吹っ飛ばしてしまうのが怖いので今回は利用せず。

sudo cd /etc/crontab /etc/cron.d/ファイル名

でCron設定ファイルを作成し、適当なエディタで開きます(要sudo実行)。

0時15分に起動させたい場合は

15 00 * * * 実行ユーザー名 dotnet DLLまでの絶対パス

これでOK。

あとは

sudo service cron restart

でCronを再起動してやれば完了。

なお、Windowsのタスクスケジューラ同様カレントディレクトリが実行プログラムがある場所ではなくホームディレクトリとなるので、

Directory.GetCurrentDirectory()

を利用している場合は要注意。
実行プログラムの場所を参照しているつもりで全然違う場所を参照してしまいます。

AppDomain.CurrentDomain.BaseDirectory

ならOK。

参考にしたサイト