AWSのコストを取得するgemを調べた
AWSは料金表を提供していますが、JSONを取得してごにょごにょ…と自分でやるのは何か違う気がします。どうせgemくらい誰か作ってるだろう、ということで少し調べてみました。
tl;dr
今のところamazon-pricingを使うか、やっぱり自前で書くのがいいのではないか。
調べたもの
(amazon|aws).*(pric|cost)
みたいなものを探すと見付かったのは以下の4つ
- aws-pricing (0.7.0)
- awsprice (0.0.5)
- amazon-pricing (0.1.97)
- awscosts (0.0.12)
aws-pricing
EC2、RDS、ElastiCache、CloudFront、EMRに対応している。最終更新が2012年でメンテされている様子がない。
awsprice
EC2しかなさそう。Homepageに設定されているのがGithubでなく、飛んでもDNSが引けなくて何も情報がない。
amazon-pricing
EC2、RDS、ElastiCacheあたりのデータが取れる。メモリの情報などもついでに取れるようにベタ書きしてあるが、ElastiCacheのm4など、更新が追い付かず抜けているものがある(PR済み)。メモリが1GBを切っていると0GBになってしまう(PR済み)。
awscosts
RDSがない。S3、EMRがある。東京リージョンのデータが取れるかどうかテストされておらず、EBSのデータが取れない(PR済み)
RDS logをRubyでダウンロード
AuroraのAudit log検証をしていて、「これ定期的にS3にアップロードしないと消えるよね?」って話になったので、まずはRDSから取ってくるとこからだね…ってことでやってみることにしました。
候補手段
方法はいくつかあるんですが、
1. rds-cliを使う
もうdeprecatedだそうで、今後メンテされないものを今から使い始めるというのはいかにもセンスがないので却下。
The Amazon RDS Command Line Interface (RDS CLI) has been deprecated. Instead, use the AWS CLI for RDS.
2. aws-cliを使う
アリなんですが、aws-cliだとrds download-db-log-file-portionというコマンドになり、最大1MB単位でしかダウンロードできず、何度も呼び出して連結して…という処理を書くのがめんどくさいので避けたいところです。
download-db-log-file-portion — AWS CLI 1.11.118 Command Reference
3. SDKを使う
2の方法だとshell scriptで繰り返し処理を書くのがめんどくさいということで、RubyなりPythonなりで書くのが現実的でしょう。SDKでダウンロードするAPIもあります。
Rubyだと Aws::RDS::Client#download_db_log_file_portion が用意されています。ただ、2とほぼ同様にmarkerをリクエストに入れて何度も呼び出す仕組みであり、めんどくさい…
4. DownloadCompleteDBLogFileを使う
[Tips] Amazon RDSのログファイルから全てのメッセージを取得する方法 | Developers.IO でも紹介されている方法です。ここではPythonでやっていますが、今回Rubyで書きたいなと思ったのでRubyでやってみました。
ということで以下は実装
続きを読むterraformのprovider aliasを使うときのtips
最近よくterraformで構成管理とか構築をやってて、ハマったのでメモ。
やろうとしたこと
AWS ap-northeast-1で主な構成を組んでいて、CloudFrontでの静的コンテンツ配信をhttpsで行いたい。このときACMを利用するが、証明書はus-east-1に配置する必要がある。
証明書の発行はWeb画面でやったので、terraformにはdata aws_acm_certificateとして利用することにした。
このときリソースの場所は普段ap-northeast-1のため、明示的にus-east-1を指定してやらないと意図した証明書が得られない(あたりまえ)。
このためには以下のサイトのように、provider aliasを使ってregionを指定し、data resourceでproviderを指定する。
これで全てはうまくいく、はずだった。
続きを読むはてなブログに移行しました
ふと思い立ったのではてなダイアリーからはてなブログへと移行を行いました。
既存記事は移行ツールにより全てリダイレクトされているはず…
一番人気の Server::Starterに対応するとはどういうことか - limitusus’s diary も正常に移行されています。
El CapitanでUSB-Serialを使う
その手の人には常識かもしれないんですが、OS X 10.10あたりからドライバ署名されていないもののインストールができなくなってますね。
手元にあるUSB-CVRS9はLinuxで問題なく動いていたので気付くのが遅れてしまいました。
さて、これを使おうとサンワサプライのサイトを見てもOS X用のドライバは落ちていません。
調べてみるとこのUSB-CVRS9、実はOEM品でした。
USB-CVRS9 は ATEN UC-232A の OEM です
MacBook で USB <-> シリアルポート変換ケーブルを使う
なるほど、ということで実際にATEN Japanのサイトからドライバを探してみるも、10.9用までしかなく、無理矢理入れようとしてもインストールには失敗してしまいました。
まさかOS X用にUSB-Serialだけ対応機種を別購入か…
困っていたところでInstalling Aten Serial-to-USB on OS X El Capitanというタイトルそのままな記事を発見。
確認してみたところATEN JapanではなくATEN本体のサイトからドライバを探すと(Support→Software & Driver)無事に10.10対応のドライバ(署名済み)が入手できました。
あとは通常通りcuなりscreenなりで接続すればOKです。
これでOS Xでもルータをいじれますね。
EBSがattachされたらSlackに通知する仕組みを作った
AWS Lambdaを以前から使ってみたいなあと思っていたのですが、「何かの操作にhookする」というので試してみました。
今回は「任意のEBS VolumeがEC2 instanceにattachされたら(AttachVolume)Slackのwebhookを叩いて通知する」というのをやってみました。
Pythonを利用しています
https://gist.github.com/limitusus/59640fc2a9b2bbaf6941
だいたいよく利用されそうな情報は変数に放り込んだので、ちょっとコードをいじれば「特定のVolumeだけ」とか「特定のinstanceだけ」とかも簡単に実現できます。
気付いたこと
- Lambdaに最初に渡ってくるイベント通知は小さく、CTのBucketにgzがあるのでそれを取りにいく処理が必要(boto3が使える)
- Lambdaが実行されるroleにS3アクセスの権限が必要なことに注意
- gzファイルの展開時もファイルに書き出すような操作はIOErrorとなる。Lambdaの世界ではインメモリで処理する必要がある
- attachされた時刻が入っているが、UNIXTIMEのミリ秒表記なのでtime.gmtimeに渡すときは1000で割る
- LambdaのスクリプトはWeb画面でも編集できるがテストしにくいしエディタも慣れたものを使った方がいい
- ローカルで開発するときは更新をawscliでできるので、以下のようなスクリプトを書いておくと簡単にデプロイできる
#!/bin/sh zip -r ebsattached.zip ebsattached.py aws --region us-east-1 lambda update-function-code \ --function-name "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:ebsattached" \ --zip-file "fileb://ebsattached.zip" echo "Deployed"