空前絶後のォ!超絶怒涛の清掃員!
GASを愛し、GASに愛された男!
そう我こそはアァ!!!札幌オフィスゥゥ!!清!掃!員!ジャァスティス!!
「ピン芸人」と「清掃員」の語感が似ていたせいで取り乱してしまいました。
こんにちわサンシャイン札幌オフィス清掃員です。
本日は弊社社内開発環境のコスト削減施策をご紹介したいと思います。
まえがき
社内利用のEC2開発環境の管理、みなさんどうされているでしょうか。
「せっかくEC2なので、使っていない時は停止してコストを抑えたい。」
「しかしながら全員でAWSのrootアカウントを共有するのは危険すぎる。」
このようなお悩みがある方もいらっしゃるのではないでしょうか。
きっと、全社員に適切なポリシーを付与してIAMアカウントを発行するのが最良なソリューションであるのだと思います。
しかしその方針にした場合にも”AWSコンソールを使ったことがないメンバーが居る”とか、”AWSコンソールの使い方を社内教育として教えられるほどのリソースがない” といったような障壁があるものです。
弊社の場合は、その全社員分のIAMアカウントを管理していくほどのリソースすら無い事は清掃員がエンジニアの真似事をしてこのような記事を書いている事からも明らかですね。
課題
弊社としてこれまで課題と感じていたのは以下のような事です
- AWS管理はエンジニアが実施しているが、EC2開発環境自体はディレクターやフロントエンドエンジニアが利用する為、起動/停止等は依頼ベースとなる
- みんな、起動していないのは困るので依頼するが、使い終わった後に放置しても誰も困りはしないので停止依頼が行われる事は無い
- 案件が減っても開発環境自体は残す事が多い為、開発環境が増える事はあってもほぼ減る事はない
- 結果、開発環境コストは増え続ける
この状態を放置するといつか開発環境コストに押し潰されて弊社突然の死を迎えるのではないかと危惧されます。
方針
- 全社員にIAMアカウントを発行するのは現状無理。そのうちに。。
- EC2インスタンスをAWSコンソール以外から管理する。
- 新たなサービスの契約などはしない。コスト削減が目的なので。
- 誰もがおなじみのインタフェースで管理できること
- スケジュール起動/スケジュール停止ができること。コアタイム以外は基本停止とする。
- 起動/停止/一覧 ができれば良い。その他AWSコンソールでできる複雑な行為は、なかったものとする。
ここから選ばれたのは、そう、綾鷹GoogleSpreadsheetでした。
まとめると・・・
- GASでGoogleSpreadsheetにEC2インスタンスの一覧を出力し
- そこから起動/停止の手動操作ができ
- トリガーによって全インスタンスのスケジュール起動/スケジュール停止が可能
となるものを作ることになりました。
参考にしたサイト
これらの良記事には感謝してもしきれません。
GoogleスプレッドシートからAWSを操作する - mikedaの日記
AWS定義情報をGoogleスプレッドシートに出力する | DevelopersIO
成果物
colsis-sapporo-cleaner/gas_dev_manager
今回、AWSへのAPI通信についてはこちらを利用させていただきました。
claspで利用するにあたり、一部修正が必要であった為に勝手に修正してソースに含めております。
完全TypeScript化は型付けが面倒だったのでちょっと諦めました。
これにより、claspのバージョンが上がったりするとビルドできなくなる可能性があります事をご承知おきください。
使い方
IAMを作る
まずはAccessKeyを得る為、このGAS専用のIAMを作っていきます。
ポリシーは弊社では下記のようにしております。
Spreadsheetからの操作に必要な最小限の権限とするようにしましょう。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:DescribeAddresses",
"ec2:DescribeInstances",
"ec2:StartInstances",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:StopInstances",
"ec2:DescribeInstanceStatus"
],
"Resource": "*"
}
]
}
作成できたらこのIAMのAccessKeyとSecretAccessKeyをメモしておきます。
Spreadsheetを作る
新しいGoogleSpreadsheetを作成します。
内容は下図のようにします。
Spreadsheetからスクリプトを作る
上部メニューの「ツール」より「スクリプト エディタ」を選択し、このSpreadsheetと関連するGASを作成します。
スクリプトのIDを.clasp.jsonに記入する
開いたスクリプトエディタのURLの下図部分をコピーし
cloneしたプロジェクトの .clasp.json 内「scriptId」節にペーストします。
{
"scriptId":"ココ!",
"rootDir":"./dist"
}
スクリプトのプロパティに、IAMAccessKeyとSecretAccessKeyとシート名とシートIDを入力
先程作ったIAMのAccessKeyとSecretAccessKey、そしてSpreadsheetIDを、スクリプトエディタの旧UIの「プロジェクトのプロパティ」から「スクリプトのプロパティ」を開き入力していきます。
SHEET_NAME は変更していなければ「シート1」となっていると思いますので、そのように入力します。
デプロイ
プロジェクト内で下記コマンドを実行すると、GASへデプロイされます。
yarn deploy
結果
Spreadsheetを開き直すと、メニュー部分に「AWS」というメニューが追加されていると思います。
「インスタンスリスト更新」を実行すると、現存するインスタンスの一覧を取得し、Spreadsheetに記入されます。
「選択セルのインスタンスを今すぐ起動」「選択セルのインスタンスを今すぐ停止」は、名前の通りではありますが、ここからインスタンスの起動/停止を実行する機能になります。
トリガー設定
GASの「トリガー」にて、scheduleStop / scheduleStart あたりをよしなに設定頂ければ、スケジュールでの起動/停止が実行されます。
この際、Spreadsheet側の「スケジュール対象外」列に「1」などの値が入っている行のインスタンスに関しては対象外となり、自動起動/自動停止は行われなくなります。
また、updateInstances を1時間に一度実行するようにトリガー設定しておくと、新しいインスタンスが増えたりした場合にも毎時自動的に取得してくれたりします。
ただし、インスタンスの増減が発生した場合には「スケジュール対象外」列との齟齬が発生しますので、必ずこのあたりを確認していただくようにお願いいたします。
(このあたりを解消するようにスクリプトを改造して頂くのも良いかもしれません)
ご注意
- 先の節でも書きましたが、インスタンス数の増減によって、「スケジュール対象外」列とのズレが発生する事があります。
この部分に関しては十分ご注意の上でご利用ください。 - AWSメニューより「今すぐ起動」等を実行しても、「状態」列が自動的に変化したりはしません。
反映させたい場合には「インスタンスリスト更新」を実行するようにしてください。 - ここで公開している内容について、一切の責任を負いませんので実行する際は自己責任にて、よくご確認の上実行してください。
まとめ
いささか今更感のある内容ですが、やはり慣れ親しんだスプレッドシートでの管理をそのまま環境の起動/停止に直結させられるというメリットは大きいのではないかなと思いました。
特に弊社のように、エンジニアとは名ばかりの清掃スタッフがAWS管理などを担っている場合にはこのような、「管理を個々人に任せる(責任放棄)」というやり方もアリなのではないかなと思っています。
これを拡張し、GCPやAzure、AlibabaCloudなどに対応させることも可能だとは思いますので、全てのクラウド環境をSpreadsheetで一元管理できると一覧性も高くて便利になりそうですね。
さてそんなわけでいつものやつ!人員募集中なのでよろしくな!