AWS Command Line Interface (CLI) 
AWS Black Belt Tech Webinar 2014 (旧マイスターシリーズ) 
ソリューションアーキテクト 辻 義⼀一 
放送:2014.10.15 最終更更新:2014.10.20(1.5.2)
Agenda 
• CLIの基本 
• CLIの各種機能 
• 組み合わせ 
• まとめ 
• Appendix
CLIの基本
Command Line Interface (CLI) とは? 
〜~AWSの各種サービスをコマンドで操作できる統合ツール〜~ 
• コマンドラインに⼿手動で⼊入⼒力力して操作 
• スクリプト等から⾃自動制御 
 
特徴 
• “aws”という名前の単⼀一コマンドで30のサービスを操作可能 
• プラットフォームや開発⾔言語などが限定されない 
Windows, Linux, Mac, Unixなど 
• ノンプログラミングでも⾃自動制御を実現 
• S3⽤用にはsyncなどの便便利利な機能あり
AWSの管理理⽅方法 
EC2 
起動、停⽌止 
S3 
アップロード 
ダウンロード 
RDS 
DB起動 
バックアップ 
CloudWatch 
情報取得 
Management 
Console (Web) 
ユーザ名・ 
パスワード 
AWS管理者・ 
オペレータ 
各⾔言語ごとの 
SDKアクセスキー・ 
シークレットキー 
AWS CLI 
 
REST API
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
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 
• サービスごとのコマンドラインツール
基本的な使い⽅方 – ⼿手動 
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
基本的な使い⽅方 – ⾃自動 
シェルスクリプトをはじめ、ほぼ全てのスクリプト・プログラミング⾔言語 
から、外部コマンド呼び出しでAWS CLIを実⾏行行できます。 
OSのスケジューラ(cronやタスクスケジューラ)やジョブ管理理製品からも、 
直接あるいはスクリプト経由で実⾏行行できます。
インストール 
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
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())
インストール – MSI形式インストーラ 
Windowsのみの⽅方法です。専⽤用のインストーラからインストールするだけ 
です。事前に何かのインストールなどは不不要です。 
既にPythonがインストールされていても使わず、独⽴立立して動作します。
インストール – 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
バージョンアップ⽅方法 
バージョンアップはインストールした⽅方法に応じて、適切切な⽅方法で⾏行行って 
下さい。 
インストール方法 インストール方法 
MSIインストーラ ・新しいバージョンのMSIインストーラを実行 
yumでパッケージ管理 ・yumでバージョンアップ 
  $ yum update 
pipでパッケージ管理 ・pipでバージョンアップ 
$ pip install --upgrade awscli 
バンドルインストーラ ・新しいバージョンのバンドルインストーラを実行
AWS上での準備 
AWS CLIを利利⽤用するには、IAMユーザやIAMロール必要です。 
まだ作っていなければ、以下の準備が必要です。 
 
• IAMユーザ・IAMロールを⽤用意する 
オンプレミス上のPCやサーバから利利⽤用 
IAMユーザを作成し、アクセスキー・シークレットキーを発⾏行行 
EC2インスタンス上から利利⽤用 
IAMロールを作成し、割り当てたEC2インスタンスの作成を推奨 
IAMユーザも利利⽤用可 
• IAMユーザ・IAMロールには必要な権限をIAM Policyで付与する
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)
設定 
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 
※設定ファイルには、キーがそのまま 
保管されます。誤って公開・流流出等 
してしまわないように注意ください。
設定 – 項⽬目⼀一覧 
項⽬目設定ファイル 
~∼/.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
パラメータの形式 
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
AWS CLIのリファレンス 
各パラメータの仕様については、リファレンスやコマンドヘルプを参照し 
てください。 
 
Webサイト: 
http://docs.aws.amazon.com/cli/latest/reference/index.html 
 
コマンドヘルプ: 
aws help 
aws command help 
aws commnad subcommand help
CLIの各種機能
これまでのリリース 
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
[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
[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 || 
|+-----------------------------------+------------------+|
[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
[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
[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 が適用された後の出力
[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, 
...
[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 
}, 
... 
名前を追加
[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”, 
... 
アイテムを絞込み
[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
[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条件 
指定できる項目はサブコマンドごとに定義 
文字列の一致でフィルタリング 
(*, ? を使用可)
[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
command : s3 
S3⽤用には”s3”と”s3api”という2つのコマンドセットが⽤用意されており、 
“s3”では分かりやすい⾼高レベルな操作が⾏行行えます。 
 
特徴 
• ローカル to S3, S3 to ローカル, S3 to S3でコピー・同期が⾏行行える 
• cp, mv, rm, ls, syncなど使い慣れたコマンドのように使える 
• -‐‑‒-‐‑‒recursive, -‐‑‒-‐‑‒include, -‐‑‒-‐‑‒excludeが使える 
• ⾃自動的に並列列処理理、マルチパートアップロードが⾏行行われる
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
返り値 
コマンドは成功すれば 0、失敗すれば 0 以外が返ります。 
ただし、情報を表⽰示する”decribe-‐‑‒*”など以外の操作を⾏行行うコマンドは基本 
的に⾮非同期に実施されます。そのため、コマンドの成功はコマンドが正常 
に受け取られた事だけを意味しています。実際の操作はまだ完了了していま 
せんし、成功するとも限りません。 
操作が完了了して成功した事を確認するには、”describe-‐‑‒*”などのコマンド 
で操作が反映されているか確認する必要があります。操作によっては、コ 
マンド実⾏行行時に出⼒力力されたIDを基に確認できます。 
参考:⼤大規模分散システム“Amazon Web Serivces”の使い⽅方 http://cloud-‐‑‒spiral.enpit.jp/wp-‐‑‒content/uploads/Slides_̲Koji.pdf
組み合わせ
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
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
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 } 
}
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/
インスタンスメタデータ 
EC2インスタンス上では、インスタンスメタデータのURL(http:// 
169.254.169.254/)から実⾏行行中のインスタンスについての情報を得るこ 
とができます。 
再利利⽤用できるスクリプトを作るのに有⽤用です。 
 
Linuxでの例例) 
 
$ curl http://169.254.169.254/latest/meta-data/instance-id 
i-XXXXXXXX 
 
Windowsでの例例) 
 
 Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/placement/availability-zone 
ap-northeast-1a 
詳細: http://docs.aws.amazon.com/ja_̲jp/AWSEC2/latest/UserGuide/AESDG-‐‑‒chapter-‐‑‒instancedata.html
まとめ
まとめ 
〜~AWS CLIでAWSの各種操作ができる〜~ 
§ 30以上のサービスに対し、合計980以上の操作が⾏行行える 
§ Windows, Linux, Max, UnixなどのOSや⾔言語に依存しない 
§ 1⾏行行のコマンドでも様々な事ができる 
§ bashやPowerShellの機能も併せて駆使すれば、 
ほとんどのことができる 
§ SDKやPowerShellツールもある 
 
AWSの操作を⾃自動化できるメリットを活⽤用しよう!
参考資料料(英語) 
• 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
Appendix
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
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 | 
+--------------+-------------------+-------------------+
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を決定
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 | 
+-------------+-----+------+
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 
___|___|___| 
...
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
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
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
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 
} 
} 
}
Tips: ⽂文字列列の扱い 
§ AWS CLIのパラメータ値 
§ bash上 
⎼ awsコマンドのパラメータの値を指定する際に、値にスペースが含まれる場合は ʻ‘ (シングル 
クォート)か ”(ダブルクォート)で囲む。 ”(ダブルクォート)を利利⽤用する場合は、中で変数が利利 
⽤用できるが⼀一部の記号には (バックスラッシュ)でエスケープする。 
⎼ -‐‑‒-‐‑‒queryの値には記号が⼊入るため、基本的に ʻ‘ (シングルクォート)を使⽤用する。値の中で、条件⼀一 
致する⽂文字列列等を指定する際は `̀(逆クォート)で囲む。 
§ PowerShell上 
⎼ 基本的な考え⽅方はbashと似ている。 
⎼ 違いはエスケープには `̀(逆クォート)を使⽤用すること。 
§ タグの値 
• 環境によって、タグの値で使⽤用可能なダブルバイト⽂文字がAWS CLIで適切切に扱えない場 
合があります。表⽰示に失敗したり、設定などの操作に失敗する場合があります。

AWS Black Belt Techシリーズ AWS Command Line Interface

  • 1.
    AWS Command LineInterface (CLI) AWS Black Belt Tech Webinar 2014 (旧マイスターシリーズ) ソリューションアーキテクト 辻 義⼀一 放送:2014.10.15 最終更更新:2014.10.20(1.5.2)
  • 2.
    Agenda • CLIの基本 • CLIの各種機能 • 組み合わせ • まとめ • Appendix
  • 3.
  • 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、ツール AWSAPIを利利⽤用する⽅方法として、以下の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
  • 14.
    バージョンアップ⽅方法 バージョンアップはインストールした⽅方法に応じて、適切切な⽅方法で⾏行行って 下さい。 インストール方法 インストール方法 MSIインストーラ ・新しいバージョンのMSIインストーラを実行 yumでパッケージ管理 ・yumでバージョンアップ   $ yum update pipでパッケージ管理 ・pipでバージョンアップ $ pip install --upgrade awscli バンドルインストーラ ・新しいバージョンのバンドルインストーラを実行
  • 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
  • 20.
    AWS CLIのリファレンス 各パラメータの仕様については、リファレンスやコマンドヘルプを参照し てください。 Webサイト: http://docs.aws.amazon.com/cli/latest/reference/index.html コマンドヘルプ: aws help aws command help aws commnad subcommand help
  • 21.
  • 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
  • 37.
  • 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/
  • 42.
    インスタンスメタデータ EC2インスタンス上では、インスタンスメタデータのURL(http:// 169.254.169.254/)から実⾏行行中のインスタンスについての情報を得るこ とができます。 再利利⽤用できるスクリプトを作るのに有⽤用です。 Linuxでの例例) $ curl http://169.254.169.254/latest/meta-data/instance-id i-XXXXXXXX Windowsでの例例) Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/placement/availability-zone ap-northeast-1a 詳細: http://docs.aws.amazon.com/ja_̲jp/AWSEC2/latest/UserGuide/AESDG-‐‑‒chapter-‐‑‒instancedata.html
  • 43.
  • 44.
    まとめ 〜~AWS CLIでAWSの各種操作ができる〜~ § 30以上のサービスに対し、合計980以上の操作が⾏行行える § Windows, Linux, Max, UnixなどのOSや⾔言語に依存しない § 1⾏行行のコマンドでも様々な事ができる § bashやPowerShellの機能も併せて駆使すれば、 ほとんどのことができる § SDKやPowerShellツールもある AWSの操作を⾃自動化できるメリットを活⽤用しよう!
  • 45.
    参考資料料(英語) • AWSCLI ユーザガイド 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
  • 46.
  • 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で適切切に扱えない場 合があります。表⽰示に失敗したり、設定などの操作に失敗する場合があります。