近いうちに 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 ついてもいいと思う。
僕の尊敬している伊藤直也さんも使ってるので最高です。
いつか直也さんみたいなすごいエンジニアになりたい。

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

Mac OS X Mavericksでawscliをインストールする

家で余ってたMBAのセットアップ。
ついでに jq もインストールする。
以前は環境変数の設定周りがごちゃごちゃしてた気がするんだよな・・・。

前提条件

  • デフォルトのpythonは無視したい(homebrewで入れる)
  • zsh
  • /etc/paths を少しいじってる(/usr/local/bin/python が使われるようにして
    る)

インストール

意外とあっさり入った。

brew install python
pip install awscli
brew install jq

デフォルトで入っているpythonとのバージョン比較(3014/07/29現在)

[noguchiwataru@noguchiwataru-no-MacBook-Air] ~
% python --version
Python 2.7.8
[noguchiwataru@noguchiwataru-no-MacBook-Air] ~
% /usr/bin/python --version
Python 2.7.5

設定

アクセストークンはIAMから発行すること。
間違ってもAWSアカウント直で発行しないこと。死ぬ。
また、出力フォーマットはjqで整形できるのでJSONが望ましい。

% aws configure
AWS Access Key ID [None]: your_access_key_id
AWS Secret Access Key [None]: your_secret_access_key
Default region name [None]: ap-northeast-1
Default output format [None]: json

以下のようにすると設定ファイルが作成されていることがわかる。

% ls -F ~/.aws/
config

中身はこんな感じ。

[default]
output = json
region = ap-northeast-1
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

動作確認

次のコマンドが動作すればOK。

% aws ec2 describe-instances | jq '.'

補完機能を有効にする

zsh

一番最後の行に以下の1行を入れる。
一番最後じゃないと動かなかった気がする。
たぶんデフォルトでパスが通っている場所においてあると思う。

# ~/.zshrc
# (snip)
source aws_zsh_completer.sh

source ~/.zshrc

bash

~/.bashrc じゃだめなので注意。

# ~/.bash_profile
complete -C aws_completer aws

source ~/.bash_profile

References

  1. Configuring the AWS Command Line Interface
  2. Macのzshでawscliの補完を有効化する – 戦場のプログラマー

awscliでec2インスタンスを操作する

よく忘れるので基本的な操作方法のまとめ。

インスタンスの操作

インスタンスを作成

  • AMI IDを調べてメモる
  • 立ち上げたいインスタンス
  • インスタンスタイプ: 現状t2.microが最小(2014/7/8現在)
  • 使用するキーペア
  • 適用するセキュリティグループ
% aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups hoge | jq '.'

AZを指定する

--placement AvailabilityZone=ap-northeast-1a をつけてやればいい。

aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups web --placement AvailabilityZone=ap-northeast-1a | jq '.'

DeleteOnTerminationを避ける

今ではほとんどEBSから起動されるEC2インスタンスがほとんどだが、このままでは DeleteOnTermination=true となってしまっているので、インスタンスをterminateするとインスタンスに紐付けられているボリューム自体も削除されてしまう。

これを避けたいなら

% aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups hoge \
--block-device-mappings "[{\"DeviceName\": \"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\": \"false\"}}]" | jq '.'

としなければならない。面倒だが。

既に作成されたインスタンスについて DeleteOnTermination=true としたい場合は

% aws ec2 modify-instance-attribute --instance-id i-dfff36d1 --block-device-mappings "[{\"DeviceName\": \"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\": \"false\"}}]" | jq '.'

とすればいい。

インスタンスを起動

% aws ec2 start-instances --instance-ids i-xxxxxxxx | jq '.'

インスタンスを停止

% aws ec2 stop-instances --instance-ids i-xxxxxxxx | jq '.'          

停まったかどうか確認。

% aws ec2 describe-instances --instance-ids i-xxxxxxxx | jq -r '.Reservations [] .Instances [] .State .Name'
stopped

インスタンスを削除(terminate)

% aws ec2 terminate-instances --instance-ids i-xxxxxxxx | jq '.'

jqで欲しい値をとってくる

インスタンスID

% aws ec2 describe-instances | jq -r '.Reservations [] .Instances [] .InstanceId'
i-xxxxxxxx

グローバルIPアドレス

% aws ec2 describe-instances | jq -r '.Reservations [] .Instances [] .PublicIpAddress'
xxx.xxx.xxx.xxx

PublicDNS名

% aws ec2 describe-instances | jq -r '.Reservations [] .Instances [] .PublicDnsName'
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

SSHで接続するとき

単なる覚え書き。

ssh ec2-user@xxx.xxx.xxx.xxx -i ~/.ssh/foobar.pem

References

  1. run-instances — AWS CLI 1.3.21 documentation
  2. start-instances — AWS CLI 1.3.21 documentation
  3. stop-instances — AWS CLI 1.3.21 documentation
  4. terminate-instances — AWS CLI 1.3.21 documentation
  5. describe-instances — AWS CLI 1.3.21 documentation

awscliでt1.microインスタンスをたちあげようとしたら怒られたでござる

t1.microインスタンスawscliから立ち上げようとAMI ID調べて立ち上げようとしたら失敗した。

% aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t1.micro --key-name default --security-groups hoge | jq '.'
A client error (InvalidParameterCombination) occurred: Non-Windows instances with a virtualization type of 'hvm' are currently not supported for this instance type.

このインスタンスタイプはサポートしてないぞゴルァ!と怒られてしまいました。
しかたなくManagement Consoleからどんなタイプが選べるのか確認してみると t2.micro というインスタンスタイプが・・・。
「無料枠に最適!」って書いてあったのでこれで立ち上げてみました。

% aws ec2 run-instances --image-id ami-29dc9228 --count 1 --instance-type t2.micro --key-name default --security-groups hoge | jq '.'
{
"Instances": [
{
(snip)
}
],
"Groups": [],
"ReservationId": "r-ffffaaaa",
"OwnerId": "ffffffffffff"
}

うーん、今度からはt1.microインスタンスじゃなくてt2.microインスタンスっていう新しい最小のインスタンスタイプが追加された?変更された?みたいだ。
発表は2014/7/1とタイムリー。
T2インスタンスにはCPUクレジットという概念が追加されたみたい。
バーストするけど、クレジット消費してしまっても極端には性能は落ちませんよってことかな?

References

  1. dogmap.jp を t1.micro から t2.micro に変更してみました | dogmap.jp
  2. Amazon Web Services ブログ: 【AWS発表】バースト可能な性能を持つ新しい低コストEC2インスタンス

awscliでセキュリティグループを定義する

このへんは手でやったほうが早い気がしないでもない。
CloudFormationとかだといろいろよろしくやってくれるんだろうか。
まだその辺の境地にも達してないけど・・・。

セキュリティグループの作成

% aws ec2 create-security-group --group-name web --description "Web server role security group."
{
"return": "true",
"GroupId": "sg-ffffffff"
}

Inbound方向の規則を定義する

ping(ICMP)応答

aws ec2 authorize-security-group-ingress --group-name web --protocol icmp --port -1 --cidr "0.0.0.0/0" | jq '.'
{
"return": "true"
}

SSH

% aws ec2 authorize-security-group-ingress --group-name web --protocol tcp --port 22 --cidr "0.0.0.0/0" | jq '.'
{
"return": "true"
}

HTTP

% aws ec2 authorize-security-group-ingress --group-name web --protocol tcp --port 80 --cidr "0.0.0.0/0" | jq '.'
{
"return": "true"
}

Outbound方向

Outbound(authorize-security-group-egress)方向はデフォルトで全通過。

まとめると

aws ec2 create-security-group --group-name web --description "Web server role security group." | jq '.'
aws ec2 authorize-security-group-ingress --group-name web --protocol icmp --port -1 --cidr "0.0.0.0/0" | jq '.'
aws ec2 authorize-security-group-ingress --group-name web --protocol tcp --port 22 --cidr "0.0.0.0/0" | jq '.'
aws ec2 authorize-security-group-ingress --group-name web --protocol tcp --port 80 --cidr "0.0.0.0/0" | jq '.'

逆の操作

セキュリティグループに対して以下の様な操作を行うと22番ポートが封じられるのでSSH不能になる。
CIDRまできちんと記述しないといけないので注意。

aws ec2 revoke-security-group-ingress --group-name web --protocol tcp --port 22 --cidr "0.0.0.0/0" | jq '.'

ただし、ICMP規則を削除するときは

aws ec2 revoke-security-group-ingress --group-name web --protocol icmp --port -1 --cidr "0.0.0.0/0" | jq '.'

に関してはいったんpingを止めないとpingをずっと受け入れ続けてしまうみたいなので、いったん Ctrl+C でとめてからもう一回pingを打ってみると通らなくなることが確認できる。

References

  1. authorize-security-group-ingress — AWS CLI 1.3.21 documentation
  2. authorize-security-group-egress — AWS CLI 1.3.21 documentation