Corredor

ウェブ、プログラミングの勉強メモ。

Oracle Application Container Cloud をコマンドラインで操作できる PSM CLI と、さらにもうちょっとだけ便利にするシェルスクリプト

Oracle Application Container Cloud (ACC) は、アプリケーション資材をデプロイしたり、ログファイルを確認したりするのにブラウザ上でポチポチしないといけないのが面倒だ。

そこで、Oracle が提供する PSM CLI というコマンドラインツールを使って、これらの操作をコマンドラインから行えるようにしてみる。

PSM CLI のダウンロード・インストール

ACC の管理画面を開いたら、右上のヘルプ「?」アイコン → ヘルプ → ダウンロード・センター → ダイアログより「Oracle offers a PaaS Service Manager (PSM) Command Line Interface (CLI)」をダウンロードする。ファイル名としては psmcli-1.1.28.zip といったファイル名になっていると思う。

インストールには Python3 の pip3 コマンドを使うので、pythonpip でそれぞれ v3 系が実行できるよう、環境設定しておくこと。自分は MacOS を使用し、Homebrew で Python3 をインストール後、PATH 設定を行った。

# Homebrew で Python3 をインストールする
$ brew install python

# インストールできたことを確認
$ python3 -V
Python 3.7.2
$ pip3 -V
pip 18.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

# `python` コマンドで v3 系が使用されるよう PATH を設定する (brew info python で紹介されている)
echo 'PATH="/usr/local/opt/python/libexec/bin:$PATH"' >> ~/.bash_profile

先程ダウンロードした Zip ファイルを psmcli.zip として、以下のようにインストールを開始する。

$ sudo -H pip3 install -U psmcli.zip

インストールが完了したら、psm setup コマンドで初期設定を行う。

$ psm setup
Username:  # 【ユーザ名】
Password:  # 【パスワード】
Retype Password:  # 【パスワード 再入力】
Identity domain:  # 【ACC 管理画面の「アプリケーション詳細」から確認できる。「idcs-」から始まるアイデンティティ・ドメイン文字列】
Region [us]:  # リージョン。US ならこのまま Enter
Output format [short]:  # 空白のまま Enter
Use OAuth? [n]:  # 空白のまま Enter
----------------------------------------------------
'psm setup' was successful. Available services are:

ログを取得する

まずはログを取得してみる。

$ psm accs log --name 【アプリ名】 --instance-name web.1
 Name                                       URL                                        Content Type     File Size  Last Modified On              
 4133174974_web.1_8f5b2a3f_2019-01-10-0...  https://neos21.us.storage.oraclecloud....  application/zip  600        2019-01-10T07:50:26.000+0000  
 4133177343_web.1_8f5b2a3f_2019-01-10-0...  https://neos21.us.storage.oraclecloud....  application/zip  548        2019-01-10T07:10:57.000+0000  
 4133177541_web.1_a4accc1e_2019-01-10-0...  https://neos21.us.storage.oraclecloud....  application/zip  2222       2019-01-10T07:07:39.000+0000  

省略表示されているが、コレって結局、管理画面上で見える「ログの Zip ファイル」の羅列では…。

アプリケーションをデプロイする

資材のデプロイは、以下のように行える。

$ psm accs push --name 【アプリ名】 --archive-path my-project.zip

…Zip 化はやっぱり必要なのね。

シェルスクリプトを書いて少し楽する

せっかくコマンドラインが用意できたのに、このままでは画面ポチポチと大差なさそうなので、少し便利にするシェルスクリプトを書いてみた。いずれも MacOS でのみ動作検証済。

acc-upload

カレントディレクトリ配下の資材を Zip 圧縮してアップロードする。

#!/bin/bash

# サービス名
service_name="【アプリ名】"
# Zip ファイル名
zip_file_name="my-project.zip"

# 古い Zip ファイルがあれば消しておく
rm -f "$zip_file_name"

# Zip 化する : 必要なファイルを指定していく
zip -r "$zip_file_name" package.json deployment.json manifest.json index.js app/ node_modules/
# 安全のため少しだけ待つ
sleep 1

# Zip ファイルをデプロイする
psm accs push --name "$service_name" --archive-path "$zip_file_name"

# 少し待つ
sleep 2
# デプロイ中ステータスになっているか確認する
psm accs activities --service-name "$service_name"

# Zip ファイルを消しておく
rm -f "$zip_file_name"

acc-status

資材のデプロイには4・5分かかるので、ステータス確認コマンドを繰り返し叩きやすくする。

#!/bin/bash

# サービス名
service_name="【アプリ名】"

# ステータス確認
psm accs activities --service-name "$service_name"

acc-log-req

アプリの動作ログが Zip ファイルとして用意されるまでには数分のラグがあるのだが、コレを強制的にリクエストするためのコマンド。

#!/bin/bash

# サービス名
service_name="【アプリ名】"

# 最新のログをリクエストする
psm accs get-logs --name "$service_name" --instance-name web.1 --output-format json

acc-logs

アプリの動作ログの最新5件を確認する。ココで確認できるのは「ログの Zip ファイルをダウンロードするための URL」までだが、ログの生成日時が確認できるので、目安として。jq コマンドが必要。

#!/bin/bash

# サービス名
service_name="【アプリ名】"

# 最新5件のログを確認する
psm accs log --name "$service_name" --instance-name web.1 --output-format json | jq --raw-output '.logs | map(.lastModifiedTime + " : " + .logURL)[]' | head -5

acc-log

最新のログファイルをダウンロードして、その場でコンソール出力する。コレがログを参照するためのほぼ最速なコマンド。こんな手間なのか ACC。

#!/bin/bash

# サービス名
service_name="【アプリ名】"
# ユーザ名
user_name="【ユーザ名】"
# パスワード
password="【パスワード】"

# 最新のログ Zip ファイルの URL を取得する
log_url="$(psm accs log --name "$service_name" --instance-name web.1 --output-format json | jq --raw-output '.logs[0].logURL')"

# 一時的にログ Zip ファイルをダウンロードして置いておくパスを指定する。ココでは `~/Downloads/` ディレクトリを使用する
log_file_path="$HOME/Downloads/$(basename "$log_url")"

# ログ Zip ファイルをダウンロードする : BASIC 認証を使用するためユーザ名とパスワードを指定する
curl --user "$user_name":"$password" "$log_url" --output "$log_file_path"

# unzip コマンドの -c オプションを使い、解凍結果をコンソール出力する
unzip -c "$log_file_path"

# curl でダウンロードしたログ Zip ファイルを削除する
rm "$log_file_path"

以上

PSM CLI がショボくてつらい…。おまけにしばらくしたら Unauthorized なるエラーが出てしまい、psm setup コマンドも通らなくなってしまった。マジ使えん。ACC はもう終わり。Heroku 使おう。

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか