Pandora Pocket

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

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

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

.NET Coreアプリ展開準備

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

はじめに .NET Core のコンソールアプリケーションを作成していれば、Linux のバッチ処理も .NET Core で書きたくなると思います。それも、スケジュール実行ができるとなおよいですね。 この記事では、.NET Core のコンソールアプリケーションを Linux の cron を使用してスケジュール実行させる方法をご紹介します。 なお、開発環境は Mac (macOS High Sierra 10.13.3) 、 .NET Core SDK 2.1.4、Visual Studio Codeで、実行環境は Vagrant で構築した CentOS 7 になります。 .NET Co…
[はてなブックマークで表示]

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

TANITA HealthPlanetのデータをDiscordに投稿するコンソールプログラム. Contribute to Ovis/PostDietProgress_Console development by creating an account on GitHub.
[はてなブックマークで表示]

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

dotnet publish --configuration Release
を実行。

これで

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

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

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ファイルの転送」機能でデプロイを行いました。
アップロードする分には課金されないはずなので、圧縮も何もせずそのままデプロイ。

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

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

Cronを利用して定期実行

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

sudo cp /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。

参考にしたサイト

https://dotnet.microsoft.com/download/linux-package-manager/ubuntu18-04/sdk-current

はじめに .NET Core のコンソールアプリケーションを作成していれば、Linux のバッチ処理も .NET Core で書きたくなると思います。それも、スケジュール実行ができるとなおよいですね。 この記事では、.NET Core のコンソールアプリケーションを Linux の cron を使用してスケジュール実行させる方法をご紹介します。 なお、開発環境は Mac (macOS High Sierra 10.13.3) 、 .NET Core SDK 2.1.4、Visual Studio Codeで、実行環境は Vagrant で構築した CentOS 7 になります。 .NET Co…
[はてなブックマークで表示]