More Related Content Similar to AWS Black Belt Techシリーズ AWS Command Line Interface (20) More from Amazon Web Services Japan (20) AWS Black Belt Techシリーズ AWS Command Line Interface1. AWS Command Line Interface (CLI)
AWS Black Belt Tech Webinar 2014 (旧マイスターシリーズ)
ソリューションアーキテクト 辻 義⼀一
放送:2014.10.15 最終更更新:2014.10.20(1.5.2)
4. Command Line Interface (CLI) とは?
〜~AWSの各種サービスをコマンドで操作できる統合ツール〜~
• コマンドラインに⼿手動で⼊入⼒力力して操作
• スクリプト等から⾃自動制御
特徴
• “aws”という名前の単⼀一コマンドで30のサービスを操作可能
• プラットフォームや開発⾔言語などが限定されない
Windows, Linux, Mac, Unixなど
• ノンプログラミングでも⾃自動制御を実現
• S3⽤用にはsyncなどの便便利利な機能あり
5. AWSの管理理⽅方法
EC2
起動、停⽌止
S3
アップロード
ダウンロード
RDS
DB起動
バックアップ
CloudWatch
情報取得
Management
Console (Web)
ユーザ名・
パスワード
AWS管理者・
オペレータ
各⾔言語ごとの
SDKアクセスキー・
シークレットキー
AWS CLI
REST API
6. AWS CLI対応サービス
2014年年10⽉月現在、30のサービスに対応しています。
• AWS CloudFormation
• AWS Data Pipeline (Preview)
• AWS Direct Connect
• AWS Elastic Beanstalk
• AWS Identity and Access Management
• AWS Import/Export
• AWS OpsWorks
• AWS Security Token Service
• AWS Storage Gateway
• AWS Support
• Amazon CloudFront (Preview)
• Amazon CloudSearch
• Amazon CloudWatch
• Amazon DynamoDB
• Amazon ElastiCache
• Amazon Elastic Compute Cloud
• Amazon Elastic MapReduce (Preview)
• Amazon Elastic Transcoder
• Amazon Kinesis
• Amazon Redshift
• Amazon Relational Database Service (Beta)
• Amazon Route 53
• Amazon Simple Email Service
• Amazon Simple Notification Service
• Amazon Simple Queue Service
• Amazon Storage Gateway
• Amazon Simple Storage Service
• Amazon Simple Workflow Service
• Auto Scaling
• Elastic Load Balancing
7. AWS CLI以外のSDK、ツール
AWS APIを利利⽤用する⽅方法として、以下のSDK、ツールが⽤用意されています。
⽬目的や状況に応じて使い分けてください。
http://aws.amazon.com/jp/tools/
• SDK
• Android
• Java Script
• iOS
• Java
• .NET
• Node.js
• PHP
• Python
• Ruby
• IDEツールキット
• Eclipse
• Visual Studio
• コマンドラインツール
• AWS Command Line Interface ← 今回
• Windows PowerShell
• サービスごとのコマンドラインツール
8. 基本的な使い⽅方 – ⼿手動
EC2インスタンスやオンプレミスにあるPCやサーバで、awsという名前の
コマンドを⼊入⼒力力して実⾏行行します。
Linux:bashなどの各種シェル(もちろんssh経由でも)
Windows:コマンドプロンプト あるいは PowerShell
$ aws ec2 create-key-pair --key-name 'demo-key'
$ aws ec2 describe-subnets --query 'Subnets[].[VpcId,CidrBlock,SubnetId]'
--output table
$ aws ec2 run-instances --image-id ami-35072834 --instance-type t2.micro
--key-name demo-key --count 2
9. 基本的な使い⽅方 – ⾃自動
シェルスクリプトをはじめ、ほぼ全てのスクリプト・プログラミング⾔言語
から、外部コマンド呼び出しでAWS CLIを実⾏行行できます。
OSのスケジューラ(cronやタスクスケジューラ)やジョブ管理理製品からも、
直接あるいはスクリプト経由で実⾏行行できます。
10. インストール
AWS CLIはPythonで作成されており、様々なインストール⽅方法が⽤用意され
ています。
プラットフォーム インストール方法
Windows ・MSI形式インストーラ
Amazon Linux ・インストール済み (yumでパッケージ管理)
全て
(Windows, Linux, Mac,
Unixなど)
・pip (pythonのパッケージ管理でインストール)
・バンドルインストーラ
・手動インストール
詳細:http://docs.aws.amazon.com/cli/latest/userguide/cli-‐‑‒chap-‐‑‒getting-‐‑‒started.html
11. AWS CLIはオープンソース
#!/usr/bin/python
# Copyright 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# Licensed under the Apache License, Version 2.0 (the License). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
# http://aws.amazon.com/apache2.0/
# or in the license file accompanying this file. This file is
# distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
import sys
import awscli.clidriver
def main():
return awscli.clidriver.main()
if __name__ == '__main__':
sys.exit(main())
12. インストール – MSI形式インストーラ
Windowsのみの⽅方法です。専⽤用のインストーラからインストールするだけ
です。事前に何かのインストールなどは不不要です。
既にPythonがインストールされていても使わず、独⽴立立して動作します。
13. インストール – pipでインストール
全てのプラットフォームで共通して⾏行行える⽅方法です。Pythonのパッケージ
管理理の仕組み pip を使ってインストールします。
1) Pythonのインストール(2.6.5以降降, 2.7, 3.3が必要)
2) pipのインストール
3) pipを使ってAWS CLIをインストール
LinuxやMacなど
(Pythonのインストール後)
$ curl https://bootstrap.pypa.io/get-pip.py | sudo python
$ sudo pip install awscli
$ aws --version
aws-cli/1.5.2 Python/2.7.6 Darwin/14.0.0
15. AWS上での準備
AWS CLIを利利⽤用するには、IAMユーザやIAMロール必要です。
まだ作っていなければ、以下の準備が必要です。
• IAMユーザ・IAMロールを⽤用意する
オンプレミス上のPCやサーバから利利⽤用
IAMユーザを作成し、アクセスキー・シークレットキーを発⾏行行
EC2インスタンス上から利利⽤用
IAMロールを作成し、割り当てたEC2インスタンスの作成を推奨
IAMユーザも利利⽤用可
• IAMユーザ・IAMロールには必要な権限をIAM Policyで付与する
16. AWS上での準備 – ベストプラクティス
AWS CLIでは、以下のように使うことがベストプラクティスです。
• 各個⼈人ごとにIAMユーザを作成して使い分ける
• IAMユーザに権限を付与せず、IAMグループに権限を付与して管理理
• IAM Policyで付与する権限は必要な範囲に留留める
• Cloud Trailで監査ログを残す
• IAM Policyで操作できるソースIPアドレスを制限する
• スクリプト内には直接アクセスキー・シークレットキーを埋め込まない
• 可能であればEC2から実⾏行行しIAMロールを活⽤用する
• rootアカウントにはMFAハードウェアトークンを割り当て⾦金金庫等に
参考:AWS Black Belt Webinar -‐‑‒ Identity and Access Management (IAM)
17. 設定
AWS CLIでは、認証情報を事前に設定しておく必要があります。
• ”aws configure”で設定
• 認証情報はSDKと同じ ”~∼/.aws/credentials” に、
AWS CLI⽤用の項⽬目は “~∼/.aws/config” に保存される
• 環境変数での設定も可$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXX
$ cat ~/.aws/config
[default]
region = ap-northeast-1
※設定ファイルには、キーがそのまま
保管されます。誤って公開・流流出等
してしまわないように注意ください。
18. 設定 – 項⽬目⼀一覧
項⽬目設定ファイル
~∼/.aws/config
設定ファイル
~∼/.aws/credentials
環境変数コマンドラインの
パラメータでの指定
プロファイル[default] あるいは
[profile プロファイル名]
[default] あるいは
[プロファイル名]
AWS_̲DEFAULT_̲PROFILE-‐‑‒-‐‑‒profile プロファイル
名
アクセスキーaws_̲access_̲key_̲id
※プロファイル毎
aws_̲access_̲key_̲id
※プロファイル毎
AWS_̲ACCESS_̲KEY_̲ID(コマンドラインで指定
不不可)
シークレットキーaws_̲secret_̲access_̲key
※プロファイル毎
aws_̲secret_̲access_̲key
※プロファイル毎
AWS_̲SECRET_̲ACCESS_̲
KEY
(コマンドラインで指定
不不可)
セッション
トークン
aws_̲session_̲token
※プロファイル毎
aws_̲session_̲token
※プロファイル毎
AWS_̲SESSION_̲TOKEN(コマンドラインで指定
不不可)
リージョンregion ※プロファイル毎(credentailsで指定不不可)AWS_̲DEFAULT_̲REGION-‐‑‒-‐‑‒region リージョン名
出⼒力力形式output ※プロファイル毎(credentailsで指定不不可)AWS_̲DEFAULT_̲OUTPUT-‐‑‒-‐‑‒output 出⼒力力形式
プレビュー扱いの
[preview]
サービスを有効
サービス名
(credentailsで指定不不可)(環境変数で指定不不可)(コマンドラインで指定
不不可)
プロキシ(configで指定不不可)(credentailsで指定不不可)HTTP_PROXY,
HTTPS_PROXY,
NO_PROXY
(コマンドラインで指定
不不可)
“aws configure list” で現在有効な設定が確認できます。
詳細:http://docs.aws.amazon.com/cli/latest/userguide/cli-‐‑‒chap-‐‑‒getting-‐‑‒started.html
19. パラメータの形式
AWS CLIコマンドのパラメータ形式は以下の通りです。
今現在、[options] の内容は [parameters] の位置にあっても動きます。
全ての[options]、[parameters]は -‐‑‒-‐‑‒ から始まります。
awsコマンド全体で共通のパラメータ
aws [options] command subcommand [parameters]
コマンドごとのパラメータ
サービスごとのコマンド
ec2, s3 など主にサービス名(例外は configure, help)
$ aws --region ap-northeast-1 ec2 describe-instances --max-items 2
22. これまでのリリース
2012.12.21 [0.4.0]
・Developer Preview版。22サービスをサポート。
2013. 9. 3 [1.0.0]
・正式版。24サービスをサポート。
2013.10.18 [1.2.0]
・-‐‑‒-‐‑‒query が追加
2014.10.6 [1.5.0]
・”aws configure”での認証情報の保管先が”~∼/.aws/credentials”に
・コマンド成功時に{“return”:”true”}を返す出⼒力力が廃⽌止
参考:リリースノート https://aws.amazon.com/releasenotes/CLI
23. [options] : -‐‑‒-‐‑‒region
コマンドを実⾏行行するリージョンを指定します。設定ファイルで指定された
リージョン設定より優先されます。
aws --region (name) [options] command subcommand [parameters]
ap-‐‑‒northeast-‐‑‒1アジアパシフィック(東京)リージョン
ap-‐‑‒southeast-‐‑‒1アジアパシフィック(シンガポール)リージョン
ap-‐‑‒southeast-‐‑‒2アジアパシフィック(シドニー)リージョン
eu-‐‑‒west-‐‑‒1欧州(アイルランド)リージョン
sa-‐‑‒east-‐‑‒1南⽶米(サンパウロ)リージョン
us-‐‑‒east-‐‑‒1⽶米国東部(バージニア北北部)リージョン
us-‐‑‒west-‐‑‒1⽶米国⻄西部(北北カリフォルニア)リージョン
us-‐‑‒west-‐‑‒2⽶米国⻄西部(オレゴン)リージョン
詳細:http://docs.aws.amazon.com/ja_̲jp/AWSEC2/latest/UserGuide/using-‐‑‒regions-‐‑‒availability-‐‑‒zones.html
24. [options] : -‐‑‒-‐‑‒output
コマンド出⼒力力のフォーマットを指定します。設定ファイルで指定された
フォーマット設定より優先されます。デフォルトはJSON形式です。
aws --output (name) [options] command subcommand [parameters]
jsonJSON形式
textテキスト形式
tableテーブル形式
例例)テーブル形式
$ aws --output table ec2 describe-regions
----------------------------------------------------------
| DescribeRegions |
+--------------------------------------------------------+
|| Regions ||
|+-----------------------------------+------------------+|
|| Endpoint | RegionName ||
|+-----------------------------------+------------------+|
|| ec2.eu-west-1.amazonaws.com | eu-west-1 ||
|| ec2.sa-east-1.amazonaws.com | sa-east-1 ||
|| ec2.us-east-1.amazonaws.com | us-east-1 ||
|| ec2.ap-northeast-1.amazonaws.com | ap-northeast-1 ||
|| ec2.us-west-2.amazonaws.com | us-west-2 ||
|| ec2.us-west-1.amazonaws.com | us-west-1 ||
|| ec2.ap-southeast-1.amazonaws.com | ap-southeast-1 ||
|| ec2.ap-southeast-2.amazonaws.com | ap-southeast-2 ||
|+-----------------------------------+------------------+|
25. [options] : -‐‑‒-‐‑‒profile
認証などに使⽤用するプロファイルを指定します。設定ファイルには、プロ
ファイル毎に情報が保存されています。無指定であればプロファイル
”default”として扱われます。
aws --profile (name) [options] command subcommand [parameters]
$ aws --profile admin configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[admin]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ cat ~/.aws/config
[default]
region = ap-northeast-1
[profile admin]
region = ap-northeast-1
26. [options] : -‐‑‒-‐‑‒debug
awsコマンドのデバッグ出⼒力力を有効にします。awsコマンドが実際に呼び
出しているAPIのリエクスやレスポンスなども含まれており、トラブル
シューティングに役⽴立立ちます。
デバッグ出⼒力力はエラー出⼒力力に⾏行行われます。
aws --debug [options] command subcommand [parameters]
$ aws --debug ec2 describe-regions 2 debug.log
{
“Regions” : [
.....
.....
$ cat error.log
2014-10-19 21:22:00,321 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.5.2 Python/2.7.6
Darwin/14.0.0, botocore version: 0.66.0
2014-10-19 21:22:00,322 - MainThread - botocore.service - DEBUG - Creating service object for: ec2
2014-10-19 21:22:00,382 - MainThread - botocore.hooks - DEBUG - Event service-data-loaded.ec2: calling
handler function signature_overrides at 0x107da0e60
27. [options] : -‐‑‒-‐‑‒query
awsコマンドの出⼒力力を、JSONの構造に基いてJMESPathクエリーでフィル
タリング等ができる強⼒力力な仕組みです。後ほど紹介するjqコマンドをパイ
プしてフィルタリングするのと似ています。
詳しい⽂文法や例例は JMESPath Specification を参照してください。
http://jmespath.readthedocs.org/en/latest/specification.html
aws --query (string) [options] command subcommand [parameters]
JMESPath Specificationでの例の書き方
search(jmespath expr, JSON document) - return value
--query が無い場合の出力
--query が適用された後の出力
28. [options] : -‐‑‒-‐‑‒query (例例)
フィルタリング前のJSON形式の出⼒力力
$ aws ec2 describe-instances
{
Reservations: [
{
OwnerId: ”XXXXXXXXXXXX”,
ReservationId: r-XXXXXXXX”,
Groups: [],
Instances: [
{
Monitoring: {
State: enabled”
},
PublicDnsName: null,
KernelId: aki-XXXXXXXX”,
State: {
Code: 80,
Name: stopped”
},
EbsOptimized: true,
...
29. [options] : -‐‑‒-‐‑‒query (例例)
出⼒力力される項⽬目(列列)をフィルタリング
出⼒力力される項⽬目(列列)をフィルタリングして、名前を割り当て
$ aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId, InstanceType]'
[
[
i-XXXXXXXX,
c3.2xlarge
],
[
i-XXXXXXXX,
t2.medium
]
]
階層を絞込み 項目を絞込み
$ aws ec2 describe-instances --query 'Reservations[].Instances[].{id:InstanceId, type:InstanceType}'
[
{
type:c3.2xlarge,
id:i-XXXXXXXX
},
...
名前を追加
30. [options] : -‐‑‒-‐‑‒query (例例)
出⼒力力されるアイテム(⾏行行)をフィルタリング
出⼒力力されるアイテム(⾏行行)を部分⽂文字列列でフィルタリング
$ aws ec2 describe-instances --query 'Reservations[].Instances[?InstanceType==`t2.micro`].[InstanceId,
InstanceType][]'
[
[
i-XXXXXXXX,
t2.medium
]
]
アイテムを絞込み
$ aws ec2 describe-instances --query 'Reservations[].Instances[?contains(InstanceType,`t2`)!=`true`].
[InstanceId, InstanceType][]'
[
[
i-XXXXXXXX,
”t1.micro,
],
[
i-XXXXXXXX”,
...
アイテムを絞込み
31. [options] : -‐‑‒-‐‑‒query (例例)
出⼒力力されるアイテム(⾏行行)をAND条件でフィルタリング
特定タイプのインスタンス数を合計
$ aws ec2 describe-instances --query 'Reservations[].Instances[?State.Name==`running`][] | [?
State.Name==`running`].[InstanceId, InstanceType, State.Name]'
[
[
i-XXXXXXXX,
t2.micro,
running
],
[
i-XXXXXXXX”,
...
結果をパイプしてさらに
評価することでAND条件に
$ aws ec2 describe-instances --query 'length(Reservations[].Instances[?InstanceType==`t2.micro`]
[InstanceId][])'
8
32. [parameters] : -‐‑‒-‐‑‒filter
awsコマンドで出⼒力力されるアイテムをフィルタリングする仕組で、
“describe-‐‑‒*”など情報を取得するコマンドの多くで使⽤用できます。AWSの
APIレベルで実現されています。-‐‑‒-‐‑‒queryとの組み合わせも⾏行行えます。
出⼒力力されるJSON構造を意識識せずに記述できます。
aws [options] command subcommand [parameters]
--filters Name=string1,Values=string1,string2 Name=string1,Values=string1,string2
OR条件
AND条件
指定できる項目はサブコマンドごとに定義
文字列の一致でフィルタリング
(*, ? を使用可)
33. [parameters] : -‐‑‒-‐‑‒filter(例例)
旧世代インスタンス
$ aws ec2 describe-instances --filters 'Name=instance-type,Values=t1.*,m1.*,m2.*,c1.*,cr1.*,hi1.*'
--query 'Reservations[].Instances[].[InstanceId, InstanceType, join(`,`, Tags[?Key==`Name`].Value)]'
--output text
i-XXXXXXXX t1.micro Bastion Host
i-XXXXXXXX m1.medium VPN Host
i-XXXXXXXX m1.xlarge Storage Gateway
特定PJ⽤用で動作しているインスタンス
instance-typeでフィルタリング
$ aws ec2 describe-instances --filters 'Name=tag:PJ,Values=AD' 'Name=instance-state-name,Values=running'
--query 'Reservations[].Instances[].[InstanceId, InstanceType, join(`,`, Tags[?Key==`Name`].Value)]'
--output text
i-XXXXXXXX t2.micro DC01
タグでキーPJが”AD” AND インスタンスが動作
i-XXXXXXXX t2.micro DC02
i-XXXXXXXX t2.micro CA01
34. command : s3
S3⽤用には”s3”と”s3api”という2つのコマンドセットが⽤用意されており、
“s3”では分かりやすい⾼高レベルな操作が⾏行行えます。
特徴
• ローカル to S3, S3 to ローカル, S3 to S3でコピー・同期が⾏行行える
• cp, mv, rm, ls, syncなど使い慣れたコマンドのように使える
• -‐‑‒-‐‑‒recursive, -‐‑‒-‐‑‒include, -‐‑‒-‐‑‒excludeが使える
• ⾃自動的に並列列処理理、マルチパートアップロードが⾏行行われる
35. command : s3
以下のサブコマンドがあります。
subcommand意味例例
cpコピーaws s3 cp test.txt s3://bucket/test/
mv移動aws s3 mv . s3://bucket/test/ --recursive
rm削除aws s3 rm s3://bucket/ --include *.tmp
--recursive
lsファイル・ディレクトリの⼀一覧aws s3 ls
aws s3 ls s3://bucket/
mbバケット作成 (make bcuket)aws s3 mb s3://bucket/
rbバケット削除 (remove bucket)aws s3 rm s3://bucket/ --force
syncディレクトリの同期aws s3 sync s3://bucket/ . --delete
websiteWebサイト設定を⾏行行うaws s3 website s3://www.example.com/
--index-document index.html
36. 返り値
コマンドは成功すれば 0、失敗すれば 0 以外が返ります。
ただし、情報を表⽰示する”decribe-‐‑‒*”など以外の操作を⾏行行うコマンドは基本
的に⾮非同期に実施されます。そのため、コマンドの成功はコマンドが正常
に受け取られた事だけを意味しています。実際の操作はまだ完了了していま
せんし、成功するとも限りません。
操作が完了了して成功した事を確認するには、”describe-‐‑‒*”などのコマンド
で操作が反映されているか確認する必要があります。操作によっては、コ
マンド実⾏行行時に出⼒力力されたIDを基に確認できます。
参考:⼤大規模分散システム“Amazon Web Serivces”の使い⽅方 http://cloud-‐‑‒spiral.enpit.jp/wp-‐‑‒content/uploads/Slides_̲Koji.pdf
38. bashなどのシェル – オートコンプリート設定
Linux/Unixのシェルでは、コマンドをオートコンプリートできるように、
awsコマンドのcommandやsubcommandをオートコンプリートで
きます。
bashの場合)
$ complete -C aws_completer aws
tcshの場合)
$ complete aws 'p/*/`aws_completer`/'
zshの場合)
$ source aws_zsh_completer.sh
詳細:http://docs.aws.amazon.com/cli/latest/userguide/cli-‐‑‒chap-‐‑‒getting-‐‑‒started.html
39. bashなどのシェル – コマンド結果を活⽤用
awsコマンドの出⼒力力はフォーマットを text にすると、bashなどのシェル
で扱いやすいです。出⼒力力を1項⽬目に抑えると、複数の値が⾃自動的に配列列のよ
うに扱えます。複数項⽬目を扱う場合は、環境変数IFSで区切切り⽂文字を⼀一時的
に変更更することで、⾏行行ごとと列列ごとに分けて扱うことも可能です。
例例)全リージョンの起動中のEC2インスタンスを停⽌止する
IFS=$'n' output=$(aws --output text ec2 describe-regions)
for line in $output;
do
IFS=$'t' region_info=($line)
instances=$(aws --region ${region_info[2]} --output text ec2 describe-instances
--query 'Reservations[].Instances[?State.Name==`running`].InstanceId[]')
if [ $instances ]; then
aws --region ${region_info[2]} ec2 stop-instances --instance-ids $instances
fi
done
REGIONS ec2.eu-west-1.amazonaws.com eu-west-1
REGIONS ec2.sa-east-1.amazonaws.com sa-east-1
...
i-xxxxxxx i-xxxxxxx i-xxxxxxx
40. PowerShell – コマンド結果を活⽤用
出⼒力力フォーマットをtextにする⽅方法も使えますし、フォーマットをJSONに
して”ConvertFrom-‐‑‒JSON”を使うと、PoweShellでオブジェクトとして扱
うこともできす。
”ConvertFrom-‐‑‒JSON”はPowerShell V3以降降で使えます。
AWS Tools for PowerShellもあります。
例例)全リージョンの起動中のEC2インスタンスを停⽌止する
$regions = aws --output text ec2 describe-regions --query 'Regions[].RegionName'
ForEach($r in $regions.split()) {
$instances = aws --region $r ec2 describe-instances | Out-String | ConvertFrom-Json
$instances.Reservations.Instances | Where-Object { $_.State.Name -eq running } | `
ForEach { aws --region $r ec2 stop-instances --instance-ids $_.InstanceId }
}
41. jqコマンドとの組み合わせ
awsコマンドとJSONを処理理できるjqコマンドとパイプで組み合わせると、
さらに様々な出⼒力力を得ることが出来ます。
-‐‑‒-‐‑‒queryと似ていますが、⽂文法が微妙に違います。
例例)インスタンス⼀一覧をCSV形式で出⼒力力する
$ aws ec2 describe-instances | jq -r '@csv (.Reservations[].Instances[] |
[.InstanceId, .Tags[0].Value, .PrivateIpAddress, .PublicIpAddress])'
“i-XXXXXXXX”,“[Project A] AP サーバ,172.31.30.66, ”XX.XX.XX.XX”
“i-XXXXXXXX”,”[Project B] DB サーバ,172.31.32.20”,
jq: http://stedolan.github.io/jq/
44. まとめ
〜~AWS CLIでAWSの各種操作ができる〜~
§ 30以上のサービスに対し、合計980以上の操作が⾏行行える
§ Windows, Linux, Max, UnixなどのOSや⾔言語に依存しない
§ 1⾏行行のコマンドでも様々な事ができる
§ bashやPowerShellの機能も併せて駆使すれば、
ほとんどのことができる
§ SDKやPowerShellツールもある
AWSの操作を⾃自動化できるメリットを活⽤用しよう!
45. 参考資料料(英語)
• AWS CLI ユーザガイド
http://docs.aws.amazon.com/cli/latest/userguide/cli-‐‑‒chap-‐‑‒welcome.html
• AWS CLI Reference
http://docs.aws.amazon.com/cli/latest/reference/
• -‐‑‒-‐‑‒query Option (JMEPath)
Specification: http://jmespath.readthedocs.org/en/latest/specification.html
Tutorial(リアルタイムに構⽂文を試せて便便利利): http://jmespath.org/tutorial.html
• APIリファレンス
EC2エラーコード:http://docs.aws.amazon.com/AWSEC2/latest/APIReference/api-‐‑‒error-‐‑‒codes.html
S3エラーコード:http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
47. Tips:AWS CLIソースコード
awsコマンドの仕様について、ドキュメント化されていない内容についても公開さ
れているソースコードで確認頂く事ができます。ただし、内容によっては今後仕様
が変わる可能性もありますので注意して参考にしてください。
awsコマンドは内部でAWS SDK for Pythonの⼀一部であるbotocoreを使⽤用しており、
こちらも参考になります。
AWS CLI: https://github.com/aws/aws-‐‑‒cli
botocore: https://github.com/boto/botocore
• API呼び出しリトライについて
参考URL:http://docs.aws.amazon.com/general/latest/gr/api-‐‑‒retries.html
参考ソースコード:botocore/retryhandler.py
botocore/data/aws/*/*.waiters.json など
• S3の⾼高レベル操作について(並列列度度・マルチパート分割サイズ)
参考ソースコード:awscli/customizations/s3/constants.py
48. bashサンプル: 踏み台サーバからEC2インスタンスを⼿手動作成 (1/4)
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ ssh-keygen
$ aws ec2 import-key-pair --key-name 'demo-key' --public-key-material file://~/.ssh/id_rsa.pub
{
KeyName: demo-key,
KeyFingerprint: ”XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
}
$ aws ec2 describe-subnets --query 'Subnets[].[VpcId,CidrBlock,SubnetId]' --output table
--------------------------------------------------------
| DescribeSubnets |
+--------------+-------------------+-------------------+
| vpc-XXXXXXXX| 172.31.32.0/24 | subnet-XXXXXXXX |
| vpc-XXXXXXXX| 172.31.0.0/20 | subnet-AAAAAAAA |
ネットワークアドレスから
| vpc-XXXXXXXX| 172.31.16.0/20 | subnet-XXXXXXXX |
配置するサブネットを決定
| vpc-XXXXXXXX| 172.31.33.0/24 | subnet-XXXXXXXX |
+--------------+-------------------+-------------------+
49. bashサンプル: 踏み台サーバからEC2インスタンスを⼿手動作成 (2/4)
$ aws ec2 describe-‐‑‒images -‐‑‒-‐‑‒owners amazon -‐‑‒-‐‑‒query 'Images[?not_̲null(Name)] | [?contains(Name,`̀amzn-‐‑‒ami-‐‑‒hvm`̀)].
{ImageId:ImageId,Name:Name,Description:Description}.sort_̲by(@, Name)' -‐‑‒-‐‑‒output table
----------------------------------------------------------------------------------------------------
| DescribeImages |
+--------------------------------------------+---------------+-------------------------------------+
| Description | ImageId | Name |
+--------------------------------------------+---------------+-------------------------------------+
| Amazon Linux AMI x86_64 HVM EBS | ami-426cd343 | amzn-ami-hvm-2012.09.0.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM EBS | ami-fd7ef9fc | amzn-ami-hvm-2012.09.1.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM EBS | ami-833ebe82 | amzn-ami-hvm-2013.03.0.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM EBS | ami-2db33c2c | amzn-ami-hvm-2013.03.1.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM EBS | ami-0961fe08 | amzn-ami-hvm-2013.09.0.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM EBS | ami-1b1a7e1a | amzn-ami-hvm-2013.09.1.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM S3 | ami-1f1a7e1e | amzn-ami-hvm-2013.09.1.x86_64-s3 |
| Amazon Linux AMI x86_64 HVM EBS | ami-eb0c6fea | amzn-ami-hvm-2013.09.2.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM S3 | ami-c10c6fc0 | amzn-ami-hvm-2013.09.2.x86_64-s3 |
| Amazon Linux AMI x86_64 HVM EBS | ami-ebbfc2ea | amzn-ami-hvm-2014.03.0.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM S3 | ami-a3bfc2a2 | amzn-ami-hvm-2014.03.0.x86_64-s3 |
| Amazon Linux AMI x86_64 HVM EBS | ami-bb562fba | amzn-ami-hvm-2014.03.1.x86_64-ebs |
| Amazon Linux AMI x86_64 HVM S3 | ami-07562f06 | amzn-ami-hvm-2014.03.1.x86_64-s3 |
| Amazon Linux AMI x86_64 HVM EBS | ami-29dc9228 | amzn-ami-hvm-2014.03.2.x86_64-ebs |
| Amazon Linux AMI 2014.03.2 x86_64 HVM GP2 | ami-df470ede | amzn-ami-hvm-2014.03.2.x86_64-gp2 |
| Amazon Linux AMI x86_64 HVM S3 | ami-a3c18fa2 | amzn-ami-hvm-2014.03.2.x86_64-s3 |
| Amazon Linux AMI 2014.09.0 x86_64 HVM EBS | ami-35072834 | amzn-ami-hvm-2014.09.0.x86_64-ebs |
| Amazon Linux AMI 2014.09.0 x86_64 HVM GP2 | ami-45072844 | amzn-ami-hvm-2014.09.0.x86_64-gp2 |
| Amazon Linux AMI 2014.09.0 x86_64 HVM S3 | ami-f70827f6 | amzn-ami-hvm-2014.09.0.x86_64-s3 |
+--------------------------------------------+---------------+-------------------------------------+
名前から利用するAMIを決定
50. bashサンプル: 踏み台サーバからEC2インスタンスを⼿手動作成 (3/4)
$ instances=$(aws ec2 run-instances --image-id ami-45072844 --instance-type t2.micro --subnet-id
subnet-AAAAAAAA --key-name demo-key --count 2 --query 'Instances[].InstanceId' --output text)
$ echo $?
0
$ echo $instances
i-fde4ace4 i-fee4ace7
$ aws ec2 describe-instance-status --instance-ids $instances --query 'InstanceStatuses[].[InstanceId,
SystemStatus.Status, InstanceStatus.Status]' --output table
------------------------------------------------
| DescribeInstanceStatus |
+------------+----------------+----------------+
| i-a7e3abbe| initializing | initializing |
| i-dfe3abc6| initializing | initializing |
+------------+----------------+----------------+
$ aws ec2 describe-instance-status --instance-ids $instances --query 'InstanceStatuses[].[InstanceId,
SystemStatus.Status, InstanceStatus.Status]' --output table
----------------------------
| DescribeInstanceStatus |
+-------------+-----+------+
| i-a7e3abbe | ok | ok |
| i-dfe3abc6 | ok | ok |
+-------------+-----+------+
51. bashサンプル: 踏み台サーバからEC2インスタンスを⼿手動作成 (4/4)
$ aws ec2 create-security-group --vpc-id vpc-8c007ae4 --group-name 'Mgmt_FromMe' --description 'ssh from my'
{
return: true,
GroupId: sg-36ca0253
}
$ aws ec2 authorize-security-group-ingress --group-name 'Mgmt_FromMe' --cidr `curl -s ifconfig.me`/32 --
protocol tcp --port 22
$ instances=($instances)
$ aws ec2 modify-instance-attribute --instance-id ${instances[0]} --groups sg-36ca0253
$ aws ec2 modify-instance-attribute --instance-id ${instances[1]} --groups sg-36ca0253
$ aws ec2 describe-instances --instance-ids ${instances[@]} --query 'Reservations[].Instances[].
[PublicIpAddress][]' --output text
54.65.0.36 54.65.0.72
$ ssh -l ec2-user 54.65.0.36
The authenticity of host '54.65.0.36 (54.65.0.36)' can't be established.
RSA key fingerprint is 0d:bd:f5:b2:aa:71:d6:72:fb:23:47:c1:8a:c0:f2:d2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '54.65.0.36' (RSA) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux AMI
___|___|___|
...
52. PowerShellサンプル: 実⾏行行中のインスタンスで⾃自動バックアップ (1/4)
事前確認
PS C:UsersAdministrator aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:
PS C:Scripts aws configure list
Name Value Type Location
---- ----- ---- --------
profile not set None None
access_key ****************YBMQ iam-role
secret_key ****************oScl iam-role
region not set None None
53. PowerShellサンプル: 実⾏行行中のインスタンスで⾃自動バックアップ (2/4)
Make-‐‑‒EBSSnapshotsByCLI.ps1
$Tag_AutoScriptBackup = AutoScriptBackup
$SaveBackupCount = 3
$AZ = [string](Invoke-RestMethod http://169.254.169.254/latest/meta-data/placement/availability-zone)
$Region = $AZ.Remove($AZ.Length - 1, 1)
# 接続されているボリュームを確認
$InstanceId = [string](Invoke-RestMethod http://169.254.169.254/latest/meta-data/instance-id)
$Volumes = @{}
ForEach($i in $(aws --region $Region ec2 describe-instances --instance-ids $InstanceId `
--query 'Reservations[].Instances[].BlockDeviceMappings[].[DeviceName, Ebs.VolumeId]' --output text)) {
$DeviceName, $VolumeId = $i.Split()
$Volumes.Add($DeviceName, $VolumeId)
}
# Disk 0以外を⼀一時的にオフラインにしてすべてのディスクに対してスナップショットを作成
# Cドライブ以外を利利⽤用しているサービスがあれば、必要に応じて⼀一旦停⽌止して再開させる
Get-Disk | Where-Object Number -ne 0 | Set-Disk -IsOffline $True
$SnapshotIds = @()
ForEach($k in $Volumes.Keys) {
$Description = Created by Make-EBSSnapshotsByCLI.ps1 (${InstanceId}:$k)
$SnapshotId = aws --region $Region ec2 create-snapshot --volume-id $Volumes[$k] `
--description $Description --query 'SnapshotId' --output text
54. PowerShellサンプル: 実⾏行行中のインスタンスで⾃自動バックアップ (3/4)
Make-‐‑‒EBSSnapshotsByCLI.ps1(続き)
Write-Host Created $SnapshotId ($Description)
$SnapshotIds += $SnapshotId
}
Get-Disk | Where-Object IsOffline -eq $True | Set-Disk -IsOffline $False
# スナップショットにタグをセット
$InstanceName = aws --region $Region ec2 describe-instances --instance-ids $InstanceId `
--query 'Reservations[].Instances[].[join(`,`, Tags[?Key==`Name`].Value)]' --output text
ForEach($s in $SnapshotIds) {
aws --region $Region ec2 create-tags --resources $s --tags Key=Name,Value=`'EC2=${InstanceName}`' `
Key=${Tag_AutoScriptBackup},Value=True
}
# 古いスナップショットを削除
ForEach($v in $Volumes.Values) {
$AllSnapshots = aws --region $Region ec2 describe-snapshots --filters Name=volume-id,Values=$v `
--query Snapshots[].{SnapshotId:SnapshotId, Description:Description, `
StartTime:StartTime}.sort_by(@, StartTime)[].[SnapshotId] --output text
$AutoSnapshots = @()
ForEach($s in $AllSnapshots) {
$auto = aws --region $Region ec2 describe-tags --filters Name=resource-id,Values=$s `
--query Tags[?Key==``${Tag_AutoScriptBackup}``][Value] --output text
55. PowerShellサンプル: 実⾏行行中のインスタンスで⾃自動バックアップ (4/4)
Make-‐‑‒EBSSnapshotsByCLI.ps1(続き)
If($auto -eq True) {
$AutoSnapshots += $s
}
}
$CountDelete = $AutoSnapshots.Length - $SaveBackupCount
If($CountDelete -gt 0) {
ForEach($s in $AutoSnapshots[0..$($CountDelete-1)]) {
Write-Host Removing $s for $v
aws --region $Region ec2 delete-snapshot --snapshot-id $s
}
}
}
56. Tips: ⽂文字列列の扱い
§ AWS CLIのパラメータ値
§ bash上
⎼ awsコマンドのパラメータの値を指定する際に、値にスペースが含まれる場合は ʻ‘ (シングル
クォート)か ”(ダブルクォート)で囲む。 ”(ダブルクォート)を利利⽤用する場合は、中で変数が利利
⽤用できるが⼀一部の記号には (バックスラッシュ)でエスケープする。
⎼ -‐‑‒-‐‑‒queryの値には記号が⼊入るため、基本的に ʻ‘ (シングルクォート)を使⽤用する。値の中で、条件⼀一
致する⽂文字列列等を指定する際は `̀(逆クォート)で囲む。
§ PowerShell上
⎼ 基本的な考え⽅方はbashと似ている。
⎼ 違いはエスケープには `̀(逆クォート)を使⽤用すること。
§ タグの値
• 環境によって、タグの値で使⽤用可能なダブルバイト⽂文字がAWS CLIで適切切に扱えない場
合があります。表⽰示に失敗したり、設定などの操作に失敗する場合があります。