2017/07/24

GCE で起動スクリプトとカスタムメタデータを活用

前回までに、Google Compute Engine (GCE) の VM インスンタンス上で Calibre を使って記事のダウンロードして、そのダウンロードしたファイルを一時的に保管する GCS のバケットを用意

今回は、この VM にシェルスクリウプトを配置して、次の動作を自動的に処理できるように設定する。
  1. VM が起動したら、Calibre で目的の記事をダウンロードし mobi ファイルを作成する
  2. mobi ファイルを Google Cloud Storage (GCS) にコピーする
  3. VM をシャットダウンする

まずは、GCE の VM 上から GCS に作成したバケット上にファイルをコピーできることを確認する。

VM 作成のところでも説明したが、GCE の VM 作成時のデフォルト設定の権限では、VM は GCS への読み込み権限はあるが、書き込み権限がない。書き込み権限を付与して作成している必要があるが、その確認。

calibre をインストールした VM に SSH でアクセスして、以下のコマンドを実行してファイルを GCS にコピーできることを確認する。

gsutil cp /tmp/article.mobi gs://<バケット名>/

ここで、「/tmp/article.mobi」は calibre の ebook-conver コマンドで記事を DL したときに指定した  mobi ファイルで、<バケット名> は前回作成した GCS のバケット名を指定する。

GCS にコピーできることが確認できたらスクリプトを作っていくのだが、GCE でスクリプトを記述する時にメタデータを利用すると、汎用性の高い VM が作れるので、今回はこれを活用する。

カスタムデータとは、GCP の VM の設定として VM の外から値を渡すことができるので、例えば calibre の ebook-convert コマンドに渡すユーザー名やパスワードをスクリプト内に記述して VM に保管する必要がない。例えば、一度構成を作ったディスクからたくさんの VM を作ったとして、その VM ごとに異なるユーザー名とかを持つ必要が出たとして、VM 毎にログインしてスクリプトを直すことをしなくても、GCP コンソール上の設定でそういった変数を VM の外部から渡すことができる。

具体的に今回のケースで説明すると、ebook-convert に渡す、記事のダウンロードに必要なそのサイトのユーザ名とパスワードをこのメタデータで渡す。設定箇所は、GCP の Compute Engine のインスタンスの編集画面で設定できる。

「カスタムメタデータ」というセクションで「項目を追加」から、キーと値のペアを設定する。例えばここでは
email と ログインユーザー名
pass と ログインパスワード
という2つのキーと値のペアを作成しておく。ログインユーザー名とログインパスワードは記事のサイトに実際にログインできるものにする。

このカスタムメタデータで設定した値を取り出すには、VM の中から以下のような curl コマンドを叩くことで取得できる。

 curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/キー -H "Metadata-Flavor: Google"

上記の例でキーが「email」だとすると

curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/email -H "Metadata-Flavor: Google"

とコマンドを叩くと、VM の中で GCP の VM に設定した変数の値が取得できる。

これらを利用して、いかのような起動スクリプトを作成する。

#/bin/sh

sudo timedatectl set-timezone Asia/Tokyo

METAURL=http://metadata.google.internal/computeMetadata/v1/instance/attributes/
HEADER="Metadata-Flavor: Google"
FILEDATE=`date "+%Y%m%d"`
EMAIL=`curl "${METAURL}email" -H "${HEADER}"`
PASS=`curl "${METAURL}pass" -H "${HEADER}"`

/opt/calibre/ebook-convert 日本経済新聞(朝刊・夕刊).recipe /tmp/${FILEDATE}.mobi --dont-download-recipe --username=${EMAIL} --password=${PASS}

gsutil cp /tmp/${FILEDATE}.mobi gs://BUCKET/

rm /tmp/${FILEDATE}.mobi

まずはじめに、VM のタイムゾーンを東京に設定している。

その後で、メタデータを取得して、EMAIL と PASS 変数に VM に設定されたそれぞれの値を取得し格納している。

そして日付をファイル名として出力先を指定して、記事の mobi ファイルの作成をしている。

mobi ファイルが作成されたら、gsutil で作成済みのバケットにコピーしている。なお、バケット名自体をメタデータで渡すことももちろんできる。

最後にコピーが終わった後の元 mobi ファイルを削除しているが、もともと /tmp の下に置いているから、このスクリプトが終了した時点で VM を停止すれば、あえて削除処理は必要ないかもしれない。

スクリプトが完成し動作確認がとれたら、最後に GCE の VM 設定から起動スクリプトとして登録する。起動スクリプトも、OS 自体にわざわざ設定する必要がない。先ほどのカスタムメタデータのキーとして「startup-script」、値にスクリプトへのフルパスを指定するだけ。

なお、この起動スクリプトとして startup-script の値は、改行して複数のコマンドを指定できるので、作成した起動スクリプトの次にシャットダウンコマンドを指定すれば、スクリプト完了後に自動的に VM を停止するような動かし方ができる。

startup-script/home/user/getmobi.sh
sudo shutdown

これのいいところは、キー名称を変更してしまえば起動スクリプトとして動作しなくなるので、VM の手入れとしてダウンロード処理から勝手にシャットダウンまでを止めて、VM を起動しつづけさせることができる。

ということで、ここまでの作業によって、VM を起動すると記事の mobi ファイルを作成し、GCS 上に置いた後は VM を終了するという、目的の動作だけに特化した vm が完成。

次は、GCS に置かれたファイルを添付ファイルとしてメール送信する仕組みを作成する。


0 件のコメント:

コメントを投稿