AWSはWebコンソールでほぼ全ての操作ができるが、CLIでも制御できる。
今まではちょこっとインスタンスのパワーON/OFFしたりする(Webのログインが面倒)程度であまり気合入れて使っていなかった。
そこでAWS CLIはWebコンソールの代替となり得るかという視点で触ってみた。
TL;DR
- CLIのみで全てを完結させるのは現実的ではない。
- 所謂ネットワーク機器のように既存環境コピペでコンフィグ流しこみ的な事は難しい。
- 予め作っておいたコマンド一覧の投入は可能かもしれない(未検証)。
- 既存構成をコピーして別環境で再利用は不可能。
- シェルスクリプト等での自動化には使い易い。
- 操作ツールというよりはAPIの一種と捉えるべき。
コマンド体系
体系立っていてドキュメントもしっかりしたものがあるため調べながら使う事自体は問題無い。
が、設定したい項目が増えると大量のオプションを付ける必要がある。
設定項目をJSONでまとめて渡す事もできるが、わざわざ手打ちするくらいならCloudFormationでいいのでは?
GUIのように流れの中で設定していく事ができないため構築手順の前後関係を考えるのが異常に大変。
一例:東京リージョンのEC2インスタンスパラメーターをJSONで表示
root@localhost#aws ec2 describe-instances --region ap-northeast-1 --output json
レスポンス内容
json, text, tableの3種類が選べるがどれも人間が見ることには向かない。
AWS側で設定されるあらゆる項目(インスタンスID、IPアドレス、AMI-ID、他多数)が表示されるためほんの2,3台インスタンスを立てるだけでとても読む気がしない量が帰ってくる。
絞り込みする機能もあるにはあるが、結局ドキュメントやJSONと睨めっこして指定内容を吟味する必要がありとても面倒。
table形式をテキストファイルに貼り付ければ一応パラメーターシート的な体裁にはなる。
それでも人間が読むには不適なので、実用しないけど名目上(監査とか?)シートが必要、というようなケースでは使えるかもしれない。
スクリプト例
スナップショット取得 → yumアップデート → リブート を自動的に行うスクリプト。
イチイチ手動でバックアップを取る必要が無く楽チン運用。
動かなくなったらスナップショットから戻すだけ。
Zabbix-AgentとかJenkinsからKickしてあげるとボタン一発で最新になって面倒なSSHログインも要らない。
※Zabbix-Agentでそのままやるとタイムアウトエラーを起こすので非同期処理になるよう工夫する。
やっつけ製作+エラー処理ほぼ無しです。自己責任でご利用下さい。
- 前提条件
- AWS上のEC2インスタンスにスクリプトを配置
- EC2サービスのフルアクセス権限がある(IAM-Role設定を推奨)
- バックアップ対象はrootディスクのみ
#!/bin/bash
#自インスタンスID取得
INSTANCE=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
#自リージョン取得
REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//'`
#bootボリュームID取得
VOLUME=`/usr/bin/aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE --query 'Reservations[].Instances[].[BlockDeviceMappings]' --output text | awk '{printf$5}'`
#日時取得
TODAY=`date '+%F %T'`
#スナップショット作成
CREATE=`/usr/bin/aws ec2 create-snapshot --region $REGION --volume-id $VOLUME --description "$TODAY automated backup, update, and reboot" --output text`
echo $CREATE
#スナップショットID取得
SNAPID=`echo $CREATE | awk '{printf$10}'`
#スナップショット作成状況表示(10秒ごと)
while :
do
STATUS=`/usr/bin/aws ec2 --region $REGION describe-snapshots --snapshot-id $SNAPID --output text | awk '{printf$14}'`
case $STATUS in
"completed") echo "`date '+%F %T'` snapshot completed"
break ;;
"pending") echo "`date '+%F %T'` making snapshot..." ;;
*) echo "`date '+%F %T'` unknown error"
exit 1 ;;
esac
sleep 10
done
#アップデート後リブート
yum -y update && reboot
exit 0