近いうちに 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にレジストラとしての機能がついたのでさっそく使ってみた

帰ってきて何の気なしにAmazonからのメールをぼーっとみてると
「あーはいはい、またなんか機能追加したのね」ってそのまま即効でアーカイブしそうになったけど、

(2014-08-09追記 日本語ブログエントリ出てました)

Domain Name Registration

You can now purchase a new domain name or transfer the management of your existing domain name to Route 53. When you purchase new domains via Route 53, the service will automatically configure a Hosted Zone for each domain and ensure the privacy of your WHOIS record at no additional charge. In addition, you benefit from AWS‘s consolidated billing to manage your domain name expenses alongside all of your other AWS resources.

この文章見てもしかしてRoute53にレジストラとしての機能が実装されたのか?

って半信半疑で少しぐぐってみたけど日本語の情報全然ないから僕の英語力がおかしいのかと思ったんだけど、
ちょっと試してみました。

上の文章を要約すると

  1. Amazon Route53 でドメインのお買い物ができるようになりました(レジストラになりました)。
  2. ドメインの転送もできます。
  3. Route53 で購入したドメインは自動的に Hosted Zone が構成されます。
  4. 何もしなくてもWHOISレコードからプライバシーが保護されます。
  5. 支払いはAWSの他のサービスの利用料金と統合して請求されます。

ものは試しなのでやってみました

ドメイン買ってみる

  • Route53のダッシュボードでDomainsを選択

f:id:wnoguchi0727:20140802020330p:plain

foo-bar-blah.com はもう僕がお名前.comで取得しちゃっているので買えません。
foo-bar-blah.jp ドメインは $100 だそうです。ぼったくり価格w

f:id:wnoguchi0727:20140802020333p:plain

今回は foo-bar-blah.net を取得することにしました。
Continue をクリック。

f:id:wnoguchi0727:20140802020332p:plain

技術者情報を入力します。
WHOISで個人情報が大公開されないようにするために Privacy Protection を Yes とするのがポイント。

f:id:wnoguchi0727:20140802024714p:plain

最終的な確認画面。規約に同意したらチェックして購入を確定する。

f:id:wnoguchi0727:20140802020335p:plain

ドメインの登録リクエストが正常に送信されたことが確認できる。

f:id:wnoguchi0727:20140802020336p:plain

ダッシュボードに戻ってみると Domain Registration in Progress となっており、登録中であることがわかる。

f:id:wnoguchi0727:20140802020337p:plain

しばらくすると Domains のメニューで選択した時の一覧に先ほど購入したドメインがリストアップされた。

f:id:wnoguchi0727:20140802020339p:plain

Hosted Zoneも自動的に構成されており、すぐに A レコード等を追加して使いはじめることができるようになっていた。

f:id:wnoguchi0727:20140802023645p:plain

すごいな・・・。

ドメイン移管してみる

お名前.comで取得したちょうど期限が切れそうなドメインが合ったのでRoute53に転送しました。

まずは Transfer Domain をクリックする。

f:id:wnoguchi0727:20140802020338p:plain

移管したいドメインを検索する。
今回はもうすぐ有効期限が切れそうなドメイン cloud-clipboard.com を選択した。

f:id:wnoguchi0727:20140802020340p:plain

AuthCode 等を入力して確定。

f:id:wnoguchi0727:20140802020341p:plain

これで移管の申請は完了。

f:id:wnoguchi0727:20140802020342p:plain

たぶんもう少ししたら結果出ると思う(2014/08/01深夜)。

Domain transfer in progress となり、ドメイン移管の手続きが始まったようです(2014/08/02朝)。

f:id:wnoguchi0727:20140802085611p:plain

Geographic Routing with Geo DNS の項についてはよくわかりませんでしたが、
負荷分散的な話でしょうか。誰か教えてください。。。

Lower Prices for DNS Queries では 8/1 から Route53 へのクエリ問合せが20%安くなったよって言ってるんでしょうか。

うーん、英語は難しいですね。

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上からはきれいさっぱり消えています。

参考サイト

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