AWS CLIで複数アカウントを利用する

やりたいこと

  • AWS CLIを使う
  • 複数のアカウント(IAMユーザなど)を切り替える

AWS CLI

導入は

pip install awscli

だけ.

プロファイルの設定

# 設定を開始
$ aws configure
#AWS Access Key ID [None]: XXXXXXXXXXXX
#AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXX
#Default region name [None]: ap-northeast-1
#Default output format [None]: json

これでAccess Key IDSecret Access Keyリージョン出力フォーマットをそれぞれ指定すれば, ~/.aws/config~/.aws/credentialsに設定が書き込まれる.

# ~/.aws/config
[default]
output = json
region = ap-northeast-1
# ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXX

現在(2017-03-07)指定できるリージョンは

  • us-east-1 米国東部(バージニア北部)
  • us-east-2 米国東部 (オハイオ)
  • us-west-1 米国西部 (北カリフォルニア)
  • us-west-2 米国西部 (オレゴン)
  • ca-central-1 カナダ (中部)
  • eu-west-1 欧州 (アイルランド)
  • eu-central-1 欧州 (フランクフルト)
  • eu-west-2 欧州 (ロンドン)
  • ap-northeast-1 アジアパシフィック (東京)
  • ap-northeast-2 アジアパシフィック (ソウル)
  • ap-southeast-1 アジアパシフィック (シンガポール)
  • ap-southeast-2 アジアパシフィック (シドニー)
  • ap-south-1 アジアパシフィック (ムンバイ)
  • sa-east-1 南米 (サンパウロ)

基本的な使い方

jsonでデータを返す設定で使うことが多いみたいなので,jqを使うと便利. macOSの場合はhomebrewで簡単に導入できる.

brew install jq

EC2

インスタンスの作成と削除
# 自分が作成したイメージの一覧
aws ec2 describe-images --owners self | jq '.Images[] | [.ImageId, .Name, .Description]' --compact-output
# キーペアの一覧
aws ec2 describe-key-pairs | jq '.KeyPairs[].KeyName'
# セキュリティグループの一覧
aws ec2 describe-security-groups | jq '.SecurityGroups[] | [.GroupId, .GroupName, .Description]' --compact-output
# インスタンスの作成(インスタンスIDを返す)
aws ec2 run-instances --image-id [ImgID] --key-name [KeyPair] --security-group-ids [SectyID] --count 1 --instance-type t2.micro | jq '.Instances[].InstanceId'
# タグで名前をつける
aws ec2 create-tags --resources [ID] --tags '[{"Key":"Name", "Value":"TestCLI"}]'
# インスタンスのID,状態,名前の一覧を表示(runningになっているかを確認)
aws ec2 describe-instances --profile biomet | jq '.Reservations[].Instances[] | [.InstanceId, .Tags, .State.Name]' --compact-output
# インスタンスのIDを指定して削除
aws ec2 terminate-instances --instance-ids [ID]
# インスタンスのID,状態,名前の一覧を表示(terminatedになっているかを確認)
aws ec2 describe-instances --profile biomet | jq '.Reservations[].Instances[] | [.InstanceId, .Tags, .State.Name]' --compact-output

[ImgID][SectyID][ID]は適切なイメージID,セキュリティグループとインスタンスIDを指定する.

インスタンスの起動と停止
# インスタンスのID,状態,名前の一覧を表示
aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | .InstanceId + "\t" + .State.Name + "\t" + .Tags[].Value'
# インスタンスのIDを指定して起動
aws ec2 start-instances --instance-ids [ID]
# 起動の確認
aws ec2 describe-instance-status --instance-ids [ID]
# 情報を絞る
aws ec2 describe-instance-status --instance-ids [ID] | jq '.InstanceStatuses[] | {InstanceId, InstanceState: .InstanceState.Name, SystemStatus: .SystemStatus.Status, InstanceStatus: .InstanceStatus.Status}'
# インスタンスのIDを指定して停止
aws ec2 stop-instances --instance-ids [ID]
# 停止の確認(ID,状態,名前の一覧取得と基本は同じ)
aws ec2 describe-instances | jq -c '.Reservations[].Instances[] | {InstanceName: .Tags[] | select(.Key == "Name").Value, InstanceId, InstanceState: .State.Name}'
# 情報を絞る
aws ec2 describe-instances | jq -c '.Reservations[].Instances[] | {InstanceName: .Tags[] | select(.Key == "Name").Value, InstanceId, InstanceState: .State.Name} | select(.InstanceId == "[ID]")'

S3

バケット操作
# バケットの作成
aws s3 mb s3://[Name]
# リージョンを指定して作成
aws s3 mb s3://[Name] --region us-west-1
# バケットの削除(中身があるとエラー)
aws s3 rb s3://[Name]
# 中身が合っても削除
aws s3 rb s3://[Name] --force

[Name]は適当なバケット名.

ファイル操作

基本的にはUnixコマンドと同じように使える.

# ローカル -> S3
aws s3 cp test.jpg s3://[Name]/testDir/testCP.jpg # コピー
aws s3 mv test.jpg s3://[Name]/testDir/testMV.jpg # 移動
# S3 -> ローカル
aws s3 cp s3://[Name]/testDir/testCP.jpg ./
aws s3 cp s3://[Name]/testDir/testMV.jpg ./

# ローカル -> S3 再帰(ディレクトリ全体の操作)
aws s3 cp test s3://[Name]/testDir/test # コピー
aws s3 mv test s3://[Name]/testDir/test # 移動
# S3 -> ローカル 再帰(ディレクトリ全体の操作)
aws s3 cp s3://[Name]/testDir/test test # コピー
aws s3 mv s3://[Name]/testDir/test test # 移動

# 確認
aws s3 ls
aws s3 ls s3://[Name]

# オブジェクト削除
aws s3 rm s3://[Name]/testDir/testCP.jpg
aws s3 rm s3://[Name]/testDir --recursive
aws s3 rm s3://[Name] --recursive # バケットの中身すべてが削除される(バケット自体は削除されない)

# 同期 rsyncのようなコマンド
aws s3 sync test s3://[Name]/testDir/test
# 次回からは差分だけがコピーされる
aws s3 sync test s3://[Name]/testDir/test
# 削除も同期
aws s3 sync test s3://[Name]/testDir/test --delete

複数のプロファイル

設定

コマンドから設定する場合は,オプションで名前を指定し情報を入力する.

# 設定を開始
$ aws configure --profile alternative
#AWS Access Key ID [None]: YYYYYYYYYYYY
#AWS Secret Access Key [None]: YYYYYYYYYYYYYYYYYYYYYYYY
#Default region name [None]: us-west-2
#Default output format [None]: json

設定が増えている.

# ~/.aws/config
[default]
output = json
region = ap-northeast-1
[alternative]
output = json
region = us-west-2
# ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXX
[alternative]
aws_access_key_id = YYYYYYYYYYYY
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYY

使い方

オプションを付けてプロファイルを指定する.

aws ec2 describe-key-pairs --profile alternative | jq '.KeyPairs[].KeyName'
aws s3 mb s3://[Name] --profile alternative

参考