近いうちに AWS CLIコマンドで生成されるファイルは ~/.aws/config から ~/.aws/credentials に統合されるというお話

Route53 を DSL で管理する Roadworker は便利だからよく使っていたのですが、 AWS CLI 生成した ~/.aws/config を読み込んでくれなくてちょっと不便だなって思っていたのですが、 Roadworker で ~/.aws/config 読み込まないのはなんで?って質問したら

Want to read from AWS credentials from awscli generated config file · Issue #6 · winebarrel/roadworker

どうやら AWS SDK では ~/.aws/credentials を読み込むのが最近のトレンドのようだったのです。

A New and Standardized Way to Manage Credentials in the AWS SDKs – AWS Security Blog

確かに aws cli のドキュメント調べたらまずはじめに ~/.aws/credentials がないか調べますって書いてあって、だがしかし、 aws configure コマンドは ~/.aws/config ファイルを生成して、なんでかなあって不思議に思ってたんですよね。

Configuring the AWS Command Line Interface – AWS Command Line Interface

親切にも指定したクレデンシャルファイルを読み込むオプションをつけて実装してくださいました。
フィードバック速い!

で、肝心の AWS CLI に質問したら即効で答え返ってきました。
もうその議論はなされていてレビュー通ったらマージされて、リリースされるよって教えてくれました。
僕のすごいへたくそな英語にも親切に答えてくれる。
それなりに通じてるんだろうか・・・。あなたがチュキだからーみたいな感じになってないといいな。

aws configure may have to generate ~/.aws/credentials instead ~/.aws/config · Issue #918 · aws/aws-cli

楽しみだなあ。
issue を登録するだけで contribution graph に色が塗られるのは気持ちいいけど、コード的なコミットもしたいなあ。

いかにも貢献していますって感じでかっこいいじゃないですか。

ちなみに今の AWS CLI のバージョンは 1.4.4 です。
リリースされたらアップグレードしましょう。

pip install --upgrade awscli

あと、Roadworker はとってもオススメです。もっと Star ついてもいいと思う。
僕の尊敬している伊藤直也さんも使ってるので最高です。
いつか直也さんみたいなすごいエンジニアになりたい。

以上、半分以上僕の日記帳でした。

Amazon Route53の設定管理ツールのRoadworkerを使ってみた

Amazon Route53をRuby DSL設定ファイルで管理するRuby製のツール。
もちろんDSLで記述されているのでバージョン管理システムとの相性も抜群です。

環境

インストール

Gemfile

僕はGemfileを用意します。

source "https://rubygems.org"
gem 'roadworker'

そして

$ bundle install --path ~/vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Using json (1.8.1)
Using mini_portile (0.5.2)
Using nokogiri (1.6.0)
Using uuidtools (2.1.4)
Installing aws-sdk (1.29.1)
Using systemu (2.5.2)
Installing macaddr (1.6.1)
Installing net-dns (0.8.0)
Installing tins (0.13.1)
Installing term-ansicolor (1.2.2)
Installing uuid (2.3.7)
Installing roadworker (0.3.10)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into /Users/noguchiwataru/vendor/bundle

特にhomebrewでインストールするパッケージが必要なわけでもなくインストールできました。

$ bundle exec roadwork --version
roadwork 0.3.10

使う

当然ですが、AWS APIアクセスのためのアクセスキーに関する環境変数が事前にセットアップされている必要があります。

export AWS_ACCESS_KEY_ID='...'
export AWS_SECRET_ACCESS_KEY='...'

初期設定

Routefileに現在管理されている Hosted Zone の設定を出力する。

$ bundle exec roadwork -e -o Routefile
Export Route53 to `Routefile

中身はどうなっているか

RubyのDSLになっています。

hosted_zone "example.com." do
rrset "example.com.", "A" do
ttl 300
resource_records(
"11.33.99.91"
)
end
rrset "*.example.com.", "A" do
ttl 300
resource_records(
"11.33.99.91"
)
end
rrset "yunocchi.example.com.", "CNAME" do
ttl 300
resource_records(
"hatenablog.com"
)
end
rrset "miyako.example.com.", "A" do
ttl 300
resource_records(
"111.222.333.444"
)
end
rrset "nori.example.com.", "CNAME" do
ttl 300
resource_records(
"domains.tumblr.com"
)
end
end

適用してみる

まずは --dry-run してみる。

$ bundle exec roadwork --dry-run -a -f Routefile
Apply `Routefile` to Route53 (dry-run)
Update ResourceRecordSet: example.com. A (dry-run)
set resource_records=[{:value=>"11.33.99.91"}] (dry-run)
Update ResourceRecordSet: *.example.com. A (dry-run)
set resource_records=[{:value=>"11.33.99.91"}] (dry-run)
No change

問題なければ適用。
2回目の実行ではちゃんと変更なしとなっている。
冪等性ばんざい。

$ bundle exec roadwork -a -f Routefile
Apply `Routefile` to Route53
Update ResourceRecordSet: pg1x.com. A
set resource_records=[{:value=>"11.33.99.91"}]
Update ResourceRecordSet: *.pg1x.com. A
set resource_records=[{:value=>"11.33.99.91"}]
$ bundle exec roadwork -a -f Routefile
Apply `Routefile` to Route53
No change

AWS Management Console上で見てみるとちゃんと適用できている。
すばらしい。

いじわるしてみる

AWS Management Console上でレコードを1行追加してみました。
本来ならRoutefile上で管理するつもりなので、あってはならないことです。
まあ、コンテキストによってはAWS Management Console上で変更したやつはRoutefileにも反映してほしい気もしますが、
そんな虫のいい話はないですね。
なので、ここではRoutefileにないレコードは消えてくれることを期待します。

$ bundle exec roadwork --dry-run -a -f Routefile
Apply `Routefile` to Route53 (dry-run)
Delete ResourceRecordSet: localns.pg1x.com. A (dry-run)
No change

余計な行が増えているよと教えてくれました。
--dry-run を消して適用すればOKです。
AWS Management Console上からはきれいさっぱり消えています。

参考サイト

クラスメソッドさんの説明がとても参考になりました。