SlideShare a Scribd company logo
1 of 67
Download to read offline
© 2015, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
James Saryerwinnie
October 2015
Automating AWS with the AWS CLI
DEV301
AWS Command Line Interface
Unified tool to manage your AWS services
$ git show 1.0.0
tag 1.0.0
Tagger: James Saryerwinnie <js@jamesls.com>
Date: Mon Sep 2 18:38:51 2013 -0700
Tagging 1.0.0 release.
commit 7fbdac0b19ea9dcc0380242068af20ef425ac5c3
Merge: 6f76721 469bab6
Author: James Saryerwinnie <js@jamesls.com>
Date: Mon Sep 2 18:38:51 2013 -0700
Merge branch 'release-1.0.0'
* release-1.0.0:
Bumping version to 1.0.0
Interactive
Shell scripts#!/bin/bash
import_key_pair() {
echo -n "Would you like to import ~/.ssh/id_rsa.pub? [y/N]: "
read confirmation
if [[ "$confirmation" != "y" ]]
then
return
fi
aws ec2 import-key-pair 
--key-name id_rsa 
--public-key-material file://~/.ssh/id_rsa.pub
}
create_instance_profile() {
echo -n "Would you like to create an IAM instance profile? [y/N]: "
read confirmation
if [[ "$confirmation" != "y" ]]; then
return
fi
aws iam create-role --role-name dev-ec2-instance 
--assume-role-policy-document "$TRUST_POLICY" || errexit "Could not create Role"
# Use a managed policy
policies=$(aws iam list-policies --scope AWS)
admin_policy_arn=$(jp -u 
"Policies[?PolicyName=='AdministratorAccess'].Arn | [0]" <<< "$policies")
aws iam attach-role-policy 
--role-name dev-ec2-instance 
--policy-arn "$admin_policy_arn" || errexit "Could not attach role policy"
# Then we need to create an instance profile from the role.
aws iam create-instance-profile 
--instance-profile-name dev-ec2-instance || 
errexit "Could not create instance profile."
# And add it to the role
aws iam add-role-to-instance-profile 
--role-name dev-ec2-instance 
--instance-profile-name dev-ec2-instance || 
errexit "Could not add role to instance profile."
}
compute_key_fingerprint() {
# Computes the fingerprint of a public SSH key given a private
# RSA key. This can be used to compare against the output given
# from aws ec2 describe-key-pair.
openssl pkey -in ~/.ssh/id_rsa -pubout -outform DER | 
openssl md5 -c | 
cut -d = -f 2 | 
tr -d '[:space:]'
}
do_setup() {
echo "Checking for required resources..."
echo ""
# 1. Check if a security group is found for
# both windows and non-windows tags.
# If not, we'll eventually give the option to
# configure this.
if resource_exists "aws ec2 describe-security-groups 
--filter Name=tag:dev-ec2-instance,Values=non-windows"; then
echo "Security groups exists."
else
echo "Security group not found."
fi
echo ""
# 2. Make sure the keypair is imported.
if [[ ! -f ~/.ssh/id_rsa ]]; then
echo "Missing ~/.ssh/id_rsa key pair."
elif has_new_enough_openssl; then
fingerprint=$(compute_key_fingerprint ~/.ssh/id_rsa)
if resource_exists "aws ec2 describe-key-pairs 
--filter Name=fingerprint,Values=$fingerprint"; then
echo "Key pair exists."
else
echo "~/.ssh/id_rsa key pair does not appear to be imported."
import_key_pair
fi
else
echo "Can't check if SSH key has been imported."
echo "You need at least openssl 1.0.0 that has a "pkey" command."
echo "Please upgrade your version of openssl."
fi
echo ""
# 3. Check that they have an IAM role called dev-ec2-instance.
# There is no server side filter for this like we have with the EC2
# APIs, so we have to manually use a --query option for us.
if resource_exists "aws iam list-instance-profiles" 
"length(InstanceProfiles[?InstanceProfileName=='dev-ec2-instance'])"; then
echo "Instance profile exists."
else
echo "Missing IAM instance profile 'dev-ec2-instance'"
create_instance_profile
fi
echo ""
}
do_setup
aws s3 ls
Application
with an AWS SDK
aws s3 ls
Application
with an AWS SDK
Shell Scripts – what we’ll cover
A good shell script
• < 100 SLOC
• Commands in sequence
• Piping input/output
• Simple domain logic
• Familiar with AWS CLI
• Familiar with bash
• Familiar with AWS
Prerequisites
$ aws ec2 describe-instances --filters Name=architecture,Values=x86_64
$ du $(ls | grep cli) | sort -nr | tail -2
Amazon S3Amazon EC2
Prerequisites
Getting up to speed
• Becoming a Command Line Expert with the AWS CLI
• Advanced Usage of the AWS CLI
• Installation
• Configuration
$
We will be in the terminal…
$
We will be in the terminal…a lot
Common patterns
Main patterns
• Single output to a single command
• Map list output to N AWS CLI commands
• Storing JSON documents and querying later
• Resource exists check
Main patterns
• Single output to a single command
• Map list output to N AWS CLI commands
• Storing JSON documents and querying later
• Resource exists check
Output to a single parameter
Output to a single parameter
$ aws ec2 describe…
{
"Reservations": [
{
"Groups": [
{
"GroupId": "sg-abc",
"GroupName": "Windows"
}
],
"Instances": [
{
"AmiLaunchIndex": 0,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"AttachTime": "2015-01-29T21:22:17.000Z",
"DeleteOnTermination": true,
"Status": "attached",
$ aws ec2 run… --foo <here>
Output to a single parameter
aws ec2 create-tags --tags Key=purpose,Value=dev 
--resources $(aws ec2 run-instances 
--image-id ami-12345 
--query Instances[].InstanceId 
--output text)
Output to a single parameter
aws ec2 create-tags --tags Key=purpose,Value=dev 
--resources $(aws ec2 run-instances 
--image-id ami-12345 
--query Instances[].InstanceId 
--output text)
Error handling
Output to a single parameter
instance_ids=$(aws ec2 run-instances 
--image-id ami-12345 
--query Instances[].InstanceId 
--output text) || errexit "Could not run instance"
aws ec2 create-tags 
--tags Key=purpose,Value=dev 
--resources "$(instance_ids)" || errexit "<errmsg>"
Output to a single parameter
instance_ids=$(aws ec2 run-instances 
--image-id ami-12345 
--query Instances[].InstanceId 
--output text) || errexit "Could not run instance"
aws ec2 create-tags 
--tags Key=purpose,Value=dev 
--resources "$(instance_ids)" || errexit "<errmsg>"
Output to a single parameter
instance_ids=$(aws ec2 run-instances 
--image-id ami-12345 
--query Instances[].InstanceId 
--output text) || errexit "Could not run instance"
aws ec2 create-tags 
--tags Key=purpose,Value=dev 
--resources "$(instance_ids)" || errexit "<errmsg>"
Output to a single parameter
• Used to map one part of the output to one part of the input
• Use --query and --output text
• Make sure to handle the error case before using the value
Main Patterns
• Single output to a single command
• Map list output to N AWS CLI commands
• Storing JSON documents and querying later
• Resource exists check
Mapping one output to N AWS calls
Mapping one output to N AWS calls
$ aws iam list…
[
"a",
"b",
”c",
"d",
"e"
]
$ aws iam … --foo <here>
$ aws iam … --foo <here>
$ aws iam … --foo <here>
$ aws iam … --foo <here>
$ aws iam … --foo <here>
Mapping one output to N AWS calls
for name in $(aws iam list-users 
--query "Users[].[UserName]" --output text); do
aws iam delete-user --user-name "$name"
done
Mapping one output to N AWS calls
for name in $(aws iam list-users 
--query "Users[].[UserName]" --output text); do
aws iam delete-user --user-name "$name"
done
User1
User2
User3
User4
User5
Mapping one output to N AWS calls
for name in $(aws iam list-users 
--query "Users[].[UserName]" --output text); do
aws iam delete-user --user-name "$name"
done
Mapping one output to N AWS calls
aws iam list-users --query "Users[].[UserName]" --output text |
xargs -I {} -P 10 aws iam delete-user --user-name "{}"
Mapping one output to N AWS calls
aws iam list-users --query "Users[].[UserName]" --output text |
xargs -I {} -P 10 aws iam delete-user --user-name "{}"
Mapping one output to N AWS calls
aws iam list-users --query "Users[].[UserName]" --output text |
xargs -I {} -P 10 aws iam delete-user --user-name "{}"
Parallel
Mapping one output to N AWS calls
-+= 72730 james -bash
-+- 76343 james xargs -I {} –P 9 aws iam delete-user --user-name {}
|--- 76348 james aws iam delete-user --user-name user1
|--- 76349 james aws iam delete-user --user-name user2
|--- 76350 james aws iam delete-user --user-name user3
|--- 76351 james aws iam delete-user --user-name user4
|--- 76352 james aws iam delete-user --user-name user5
|--- 76353 james aws iam delete-user --user-name user6
|--- 76354 james aws iam delete-user --user-name user7
|--- 76355 james aws iam delete-user --user-name user8
--- 76356 james aws iam delete-user --user-name user9
Mapping one output to N AWS calls
• Use a for loop for functions
• If you’re using xargs, use -I {}
• Use xargs –P N parallel execution
• Use “.[UserName]” instead of “.UserName” to get
newline separated output..
• This works because nothing is written to stdout on error
Demo
Main patterns
 Single output to a single command
 Map list output to N AWS CLI commands
• Storing JSON documents and querying later
• Resource exists check
Saving the entire output for querying later
{
"AmiLaunchIndex": 0,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"AttachTime": "2015-01-29T21:22:17.000Z",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-12345"
}
},
{
"DeviceName": "xvdg",
"Ebs": {
"AttachTime": "2015-09-17T19:14:27.000Z",
"DeleteOnTermination": false,
"Status": "attached",
"VolumeId": "vol-12345"
}
}
],
"ClientToken": "12345",
"EbsOptimized": false,
"Hypervisor": "xen",
"IamInstanceProfile": {
"Arn": "arn:aws:iam::12345",
"Id": "12345"
},
"ImageId": "ami-12345",
"InstanceId": "i-12345",
"InstanceType": "m3.large",
"KeyName": "id_rsa",
"LaunchTime": "2015-09-17T17:24:13.000Z",
"Monitoring": {
"State": "disabled"
},
}
instance =
Saving the entire output for querying later
{
"AmiLaunchIndex": 0,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"AttachTime": "2015-01-29T21:22:17.000Z",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-12345"
}
},
{
"DeviceName": "xvdg",
"Ebs": {
"AttachTime": "2015-09-17T19:14:27.000Z",
"DeleteOnTermination": false,
"Status": "attached",
"VolumeId": "vol-12345"
}
}
],
"ClientToken": "12345",
"EbsOptimized": false,
"Hypervisor": "xen",
"IamInstanceProfile": {
"Arn": "arn:aws:iam::12345",
"Id": "12345"
},
"ImageId": "ami-12345",
"InstanceId": "i-12345",
"InstanceType": "m3.large",
"KeyName": "id_rsa",
"LaunchTime": "2015-09-17T17:24:13.000Z",
"Monitoring": {
"State": "disabled"
},
}
instance = query $instance 
BlockDeviceMappings[0].VolumeId
Saving the entire output for querying later
{
"AmiLaunchIndex": 0,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"AttachTime": "2015-01-29T21:22:17.000Z",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-12345"
}
},
{
"DeviceName": "xvdg",
"Ebs": {
"AttachTime": "2015-09-17T19:14:27.000Z",
"DeleteOnTermination": false,
"Status": "attached",
"VolumeId": "vol-12345"
}
}
],
"ClientToken": "12345",
"EbsOptimized": false,
"Hypervisor": "xen",
"IamInstanceProfile": {
"Arn": "arn:aws:iam::12345",
"Id": "12345"
},
"ImageId": "ami-12345",
"InstanceId": "i-12345",
"InstanceType": "m3.large",
"KeyName": "id_rsa",
"LaunchTime": "2015-09-17T17:24:13.000Z",
"Monitoring": {
"State": "disabled"
},
}
instance =
query $instance ImageId
query $instance 
BlockDeviceMappings[0].VolumeId
Saving the entire output for querying later
{
"AmiLaunchIndex": 0,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"AttachTime": "2015-01-29T21:22:17.000Z",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-12345"
}
},
{
"DeviceName": "xvdg",
"Ebs": {
"AttachTime": "2015-09-17T19:14:27.000Z",
"DeleteOnTermination": false,
"Status": "attached",
"VolumeId": "vol-12345"
}
}
],
"ClientToken": "12345",
"EbsOptimized": false,
"Hypervisor": "xen",
"IamInstanceProfile": {
"Arn": "arn:aws:iam::12345",
"Id": "12345"
},
"ImageId": "ami-12345",
"InstanceId": "i-12345",
"InstanceType": "m3.large",
"KeyName": "id_rsa",
"LaunchTime": "2015-09-17T17:24:13.000Z",
"Monitoring": {
"State": "disabled"
},
}
instance =
query $instance InstanceId
query $instance ImageId
query $instance 
BlockDeviceMappings[0].VolumeId
jp – The JMESPath CLI
• Same language as --query
• Cross platform executable
• https://github.com/jmespath/jp
jp – The JMESPath CLI
• Same language as --query
• Cross platform executable
• https://github.com/jmespath/jp
Mac OS X
brew tap jmespath/jmespath
brew install jp
Saving the entire output for querying later
instance=$(aws run-instance --image-id ami-1234 
--query Instances[0])
query() {
jp -u "$2" <<<"$1"
}
instance_id=$(query "$instance" InstanceId)
state_name=$(query "$instance" State.Name)
instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
Saving the entire output for querying later
instance=$(aws run-instance --image-id ami-1234 
--query Instances[0])
query() {
jp -u "$2" <<<"$1"
}
instance_id=$(query "$instance" InstanceId)
state_name=$(query "$instance" State.Name)
instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
instance=
{"InstanceId": ”i-12345", ... }
Saving the entire output for querying later
instance=$(aws run-instance --image-id ami-1234 
--query Instances[0])
query() {
jp -u "$2" <<<"$1"
}
instance_id=$(query "$instance" InstanceId)
state_name=$(query "$instance" State.Name)
instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
Saving the entire output for querying later
instance=$(aws run-instance --image-id ami-1234 
--query Instances[0])
query() {
jp -u "$2" <<<"$1"
}
instance_id=$(query "$instance" InstanceId)
state_name=$(query "$instance" State.Name)
instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
Saving the entire output for querying later
instance=$(aws run-instance --image-id ami-1234 
--query Instances[0])
query() {
jp -u "$2" <<<"$1"
}
instance_id=$(query "$instance" InstanceId)
state_name=$(query "$instance" State.Name)
instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
Saving the entire output for querying later
1. Use JSON output, not text, --output json
2. Store the entire thing as a variable, or write to a temp
file if output size is a concern.
3. Use the “jp” command to filter down results as needed.
Main Patterns
 Single output to a single command
 Map list output to N AWS CLI commands
 Storing JSON documents and querying later
• Resource exists check
resource_exists() {
}
1. Determine command to run with query
2. Run command and check errors
3. Check length of query result
resource_exists() {
local cmd
local num_matches
if [[ -z "$2" ]]; then
cmd="$1 --query length(*[0])"
else
cmd="$1 --query $2"
fi
}
2. Run command and check errors
3. Check length of query result
resource_exists() {
num_matches=$($command)
if [[ "$?" -ne 0 ]]; then
echo "Could not check if resource exists, exiting."
exit 2
fi
}
3. Check length of query result
1. Determine command to run with query
resource_exists() {
if [[ "$num_matches" -gt 0 ]]; then
# RC of 0 mean the resource exists, success.
return 0
else
return 1
fi
}
1. Determine command to run with query
2. Run command and check errors
Usage: Server-side filtering
describe_groups="aws ec2 describe-security-groups"
if resource_exists "$describe_groups 
--filter Name=tag:dev-ec2-instance,Values=linux"; then
echo "Security groups exists."
else
echo "Security group not found."
fi
Usage: Client-side filtering
list_profiles="aws iam list-instance-profiles"
if resource_exists "$list_profiles" 
"InstanceProfiles[?InstanceProfileName=='dev-ec2-instance']"
then
echo "Instance profile exists."
else
echo "Missing IAM instance profile 'dev-ec2-instance'"
create_instance_profile
fi
Resource exists
• Check if a resource exists by filtering down a list and
checking if the length is greater than 0.
• Use server side filtering when possible
• Use JMESPath query for client side filtering
Demo
Common Patterns
 Single output to a single command
 Map list output to N AWS CLI commands
 Storing JSON documents and querying later
 Resource exists check
Deployment tips
# * * * * * command to execute
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── day of week (0 – 6)
# │ │ │ └────────── month (1 - 12)
# │ │ └─────────────── day of month (1 - 31)
# │ └──────────────────── hour (0 - 23)
# └───────────────────────── min (0 - 59)
Cron
$ whoami
$HOME/.aws/config
$HOME/.aws/credentials
export AWS_CONFIG_FILE
export AWS_SHARED_CREDENTIALS_FILE
$ whoami
$HOME/.aws/config
$HOME/.aws/credentials
export AWS_CONFIG_FILE
export AWS_SHARED_CREDENTIALS_FILE
• Explicitly set AWS_CONFIG_FILE/AWS_SHARED_CREDENTIALS_FILE
• Ensure user running cron job has ~/.aws/config ~/.aws/credentials
aws configure set region 
$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document 
| jp -u 'region')
Configure a region
Summary
• Common patterns
• Shell script examples
• Deployment
• Tools
Remember to complete
your evaluations!
Thank you!
• User guide: http://docs.aws.amazon.com/cli/latest/userguide/
• Reference docs: http://docs.aws.amazon.com/cli/latest/reference/
• JMESPath: http://jmespath.org/
• re:Invent 2014 - https://www.youtube.com/watch?v=vP56l7qThNs
• re:Invent 2013 - https://www.youtube.com/watch?v=qiPt1NoyZm0

More Related Content

What's hot

AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
Amazon Web Services Japan
 

What's hot (20)

Amazon EC2 Masterclass
Amazon EC2 MasterclassAmazon EC2 Masterclass
Amazon EC2 Masterclass
 
Advanced Security Best Practices Masterclass
Advanced Security Best Practices MasterclassAdvanced Security Best Practices Masterclass
Advanced Security Best Practices Masterclass
 
Deep Dive - Advanced Usage of the AWS CLI
Deep Dive - Advanced Usage of the AWS CLIDeep Dive - Advanced Usage of the AWS CLI
Deep Dive - Advanced Usage of the AWS CLI
 
마이크로 서비스를 위한 AWS Cloud Map & App Mesh - Saeho Kim (AWS Solutions Architect)
마이크로 서비스를 위한 AWS Cloud Map & App Mesh - Saeho Kim (AWS Solutions Architect)마이크로 서비스를 위한 AWS Cloud Map & App Mesh - Saeho Kim (AWS Solutions Architect)
마이크로 서비스를 위한 AWS Cloud Map & App Mesh - Saeho Kim (AWS Solutions Architect)
 
Introduction to Identity and Access Management (IAM)
Introduction to Identity and Access Management (IAM)Introduction to Identity and Access Management (IAM)
Introduction to Identity and Access Management (IAM)
 
AWS IAM Tutorial | Identity And Access Management (IAM) | AWS Training Videos...
AWS IAM Tutorial | Identity And Access Management (IAM) | AWS Training Videos...AWS IAM Tutorial | Identity And Access Management (IAM) | AWS Training Videos...
AWS IAM Tutorial | Identity And Access Management (IAM) | AWS Training Videos...
 
Deep Dive: AWS Command Line Interface
Deep Dive: AWS Command Line InterfaceDeep Dive: AWS Command Line Interface
Deep Dive: AWS Command Line Interface
 
AWS CloudFormation Masterclass
AWS CloudFormation MasterclassAWS CloudFormation Masterclass
AWS CloudFormation Masterclass
 
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
 
KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019
KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019
KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019
 
Become an AWS IAM Policy Ninja
Become an AWS IAM Policy NinjaBecome an AWS IAM Policy Ninja
Become an AWS IAM Policy Ninja
 
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
 
Continuous Delivery using AWS CodePipeline, AWS Lambda & AWS ElasticBeanstalk
Continuous Delivery using AWS CodePipeline, AWS Lambda & AWS ElasticBeanstalkContinuous Delivery using AWS CodePipeline, AWS Lambda & AWS ElasticBeanstalk
Continuous Delivery using AWS CodePipeline, AWS Lambda & AWS ElasticBeanstalk
 
Improving Infrastructure Governance on AWS - AWS June 2016 Webinar Series
Improving Infrastructure Governance on AWS - AWS June 2016 Webinar SeriesImproving Infrastructure Governance on AWS - AWS June 2016 Webinar Series
Improving Infrastructure Governance on AWS - AWS June 2016 Webinar Series
 
AWS Power Tools: Advanced AWS CloudFormation and CLI
AWS Power Tools: Advanced AWS CloudFormation and CLIAWS Power Tools: Advanced AWS CloudFormation and CLI
AWS Power Tools: Advanced AWS CloudFormation and CLI
 
AWS CodeBuild Demo
AWS CodeBuild DemoAWS CodeBuild Demo
AWS CodeBuild Demo
 
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
 
(DVO315) Log, Monitor and Analyze your IT with Amazon CloudWatch
(DVO315) Log, Monitor and Analyze your IT with Amazon CloudWatch(DVO315) Log, Monitor and Analyze your IT with Amazon CloudWatch
(DVO315) Log, Monitor and Analyze your IT with Amazon CloudWatch
 
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
AWS Black Belt Online Seminar 2017 AWS Elastic BeanstalkAWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
 
Introduction to EC2
Introduction to EC2Introduction to EC2
Introduction to EC2
 

Viewers also liked

Viewers also liked (13)

AWS re:Invent 2016: The Effective AWS CLI User (DEV402)
AWS re:Invent 2016: The Effective AWS CLI User (DEV402)AWS re:Invent 2016: The Effective AWS CLI User (DEV402)
AWS re:Invent 2016: The Effective AWS CLI User (DEV402)
 
AWS re:Invent 2016: Develop, Build, Deploy, and Manage Containerized Services...
AWS re:Invent 2016: Develop, Build, Deploy, and Manage Containerized Services...AWS re:Invent 2016: Develop, Build, Deploy, and Manage Containerized Services...
AWS re:Invent 2016: Develop, Build, Deploy, and Manage Containerized Services...
 
Licensing Windows Workloads on AWS - AWS Online Tech Talks
Licensing Windows Workloads on AWS - AWS Online Tech TalksLicensing Windows Workloads on AWS - AWS Online Tech Talks
Licensing Windows Workloads on AWS - AWS Online Tech Talks
 
Know Before You Go - AWS Online Tech Talks
Know Before You Go - AWS Online Tech TalksKnow Before You Go - AWS Online Tech Talks
Know Before You Go - AWS Online Tech Talks
 
Bringing Characters to Life with Amazon Polly Text-to-Speech - AWS Online Tec...
Bringing Characters to Life with Amazon Polly Text-to-Speech - AWS Online Tec...Bringing Characters to Life with Amazon Polly Text-to-Speech - AWS Online Tec...
Bringing Characters to Life with Amazon Polly Text-to-Speech - AWS Online Tec...
 
Women in Big Data
Women in Big DataWomen in Big Data
Women in Big Data
 
Disaster Recovery Options with AWS - AWS Online Tech Talks
Disaster Recovery Options with AWS - AWS Online Tech TalksDisaster Recovery Options with AWS - AWS Online Tech Talks
Disaster Recovery Options with AWS - AWS Online Tech Talks
 
Hands on Lab: Deploy .NET Code to AWS from Visual Studio - AWS Online Tech Talks
Hands on Lab: Deploy .NET Code to AWS from Visual Studio - AWS Online Tech TalksHands on Lab: Deploy .NET Code to AWS from Visual Studio - AWS Online Tech Talks
Hands on Lab: Deploy .NET Code to AWS from Visual Studio - AWS Online Tech Talks
 
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
 
Sentiment Analysis Using Apache MXNet and Gluon - AWS Online Tech Talks
Sentiment Analysis Using Apache MXNet and Gluon - AWS Online Tech TalksSentiment Analysis Using Apache MXNet and Gluon - AWS Online Tech Talks
Sentiment Analysis Using Apache MXNet and Gluon - AWS Online Tech Talks
 
AWS Step Functions - Dev lounge Express Edition.pdf
AWS Step Functions - Dev lounge Express Edition.pdfAWS Step Functions - Dev lounge Express Edition.pdf
AWS Step Functions - Dev lounge Express Edition.pdf
 
Building Serverless Websites with Lambda@Edge - AWS Online Tech Talks
Building Serverless Websites with Lambda@Edge - AWS Online Tech TalksBuilding Serverless Websites with Lambda@Edge - AWS Online Tech Talks
Building Serverless Websites with Lambda@Edge - AWS Online Tech Talks
 
Essential Capabilities of an IoT Cloud Platform - AWS Online Tech Talks
Essential Capabilities of an IoT Cloud Platform - AWS Online Tech TalksEssential Capabilities of an IoT Cloud Platform - AWS Online Tech Talks
Essential Capabilities of an IoT Cloud Platform - AWS Online Tech Talks
 

Similar to (DEV301) Automating AWS with the AWS CLI

대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
Amazon Web Services Korea
 

Similar to (DEV301) Automating AWS with the AWS CLI (20)

대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
 
Amazon Web Services for PHP Developers
Amazon Web Services for PHP DevelopersAmazon Web Services for PHP Developers
Amazon Web Services for PHP Developers
 
Masterclass Advanced Usage of the AWS CLI
Masterclass Advanced Usage of the AWS CLIMasterclass Advanced Usage of the AWS CLI
Masterclass Advanced Usage of the AWS CLI
 
Amazon ECS Deep Dive
Amazon ECS Deep DiveAmazon ECS Deep Dive
Amazon ECS Deep Dive
 
The Best of Both Worlds: Implementing Hybrid IT with AWS (ENT218) | AWS re:In...
The Best of Both Worlds: Implementing Hybrid IT with AWS (ENT218) | AWS re:In...The Best of Both Worlds: Implementing Hybrid IT with AWS (ENT218) | AWS re:In...
The Best of Both Worlds: Implementing Hybrid IT with AWS (ENT218) | AWS re:In...
 
Deep Dive: AWS Command Line Interface
Deep Dive: AWS Command Line InterfaceDeep Dive: AWS Command Line Interface
Deep Dive: AWS Command Line Interface
 
Deployment and Management on AWS:
 A Deep Dive on Options and Tools
Deployment and Management on AWS:
 A Deep Dive on Options and ToolsDeployment and Management on AWS:
 A Deep Dive on Options and Tools
Deployment and Management on AWS:
 A Deep Dive on Options and Tools
 
Aws cli
Aws cliAws cli
Aws cli
 
Aws cli
Aws cliAws cli
Aws cli
 
Immutable AWS Deployments with Packer and Jenkins
Immutable AWS Deployments with Packer and JenkinsImmutable AWS Deployments with Packer and Jenkins
Immutable AWS Deployments with Packer and Jenkins
 
(DEV301) Advanced Usage of the AWS CLI | AWS re:Invent 2014
(DEV301) Advanced Usage of the AWS CLI | AWS re:Invent 2014(DEV301) Advanced Usage of the AWS CLI | AWS re:Invent 2014
(DEV301) Advanced Usage of the AWS CLI | AWS re:Invent 2014
 
Immutable Deployments with AWS CloudFormation and AWS Lambda
Immutable Deployments with AWS CloudFormation and AWS LambdaImmutable Deployments with AWS CloudFormation and AWS Lambda
Immutable Deployments with AWS CloudFormation and AWS Lambda
 
DevOps for the Enterprise: Virtual Office Hours
DevOps for the Enterprise: Virtual Office HoursDevOps for the Enterprise: Virtual Office Hours
DevOps for the Enterprise: Virtual Office Hours
 
自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-
 
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine YardHow I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
 
AWS Study Group - Chapter 03 - Elasticity and Scalability Concepts [Solution ...
AWS Study Group - Chapter 03 - Elasticity and Scalability Concepts [Solution ...AWS Study Group - Chapter 03 - Elasticity and Scalability Concepts [Solution ...
AWS Study Group - Chapter 03 - Elasticity and Scalability Concepts [Solution ...
 
Deep Dive into AWS CLI - the command line interface
Deep Dive into AWS CLI - the command line interfaceDeep Dive into AWS CLI - the command line interface
Deep Dive into AWS CLI - the command line interface
 
Streamline Hadoop DevOps with Apache Ambari
Streamline Hadoop DevOps with Apache AmbariStreamline Hadoop DevOps with Apache Ambari
Streamline Hadoop DevOps with Apache Ambari
 
Deep Dive: AWS Command Line Interface
Deep Dive: AWS Command Line InterfaceDeep Dive: AWS Command Line Interface
Deep Dive: AWS Command Line Interface
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 

More from Amazon Web Services

Tools for building your MVP on AWS
Tools for building your MVP on AWSTools for building your MVP on AWS
Tools for building your MVP on AWS
Amazon Web Services
 
How to Build a Winning Pitch Deck
How to Build a Winning Pitch DeckHow to Build a Winning Pitch Deck
How to Build a Winning Pitch Deck
Amazon Web Services
 
Building a web application without servers
Building a web application without serversBuilding a web application without servers
Building a web application without servers
Amazon Web Services
 
AWS_HK_StartupDay_Building Interactive websites while automating for efficien...
AWS_HK_StartupDay_Building Interactive websites while automating for efficien...AWS_HK_StartupDay_Building Interactive websites while automating for efficien...
AWS_HK_StartupDay_Building Interactive websites while automating for efficien...
Amazon Web Services
 

More from Amazon Web Services (20)

Come costruire servizi di Forecasting sfruttando algoritmi di ML e deep learn...
Come costruire servizi di Forecasting sfruttando algoritmi di ML e deep learn...Come costruire servizi di Forecasting sfruttando algoritmi di ML e deep learn...
Come costruire servizi di Forecasting sfruttando algoritmi di ML e deep learn...
 
Big Data per le Startup: come creare applicazioni Big Data in modalità Server...
Big Data per le Startup: come creare applicazioni Big Data in modalità Server...Big Data per le Startup: come creare applicazioni Big Data in modalità Server...
Big Data per le Startup: come creare applicazioni Big Data in modalità Server...
 
Esegui pod serverless con Amazon EKS e AWS Fargate
Esegui pod serverless con Amazon EKS e AWS FargateEsegui pod serverless con Amazon EKS e AWS Fargate
Esegui pod serverless con Amazon EKS e AWS Fargate
 
Costruire Applicazioni Moderne con AWS
Costruire Applicazioni Moderne con AWSCostruire Applicazioni Moderne con AWS
Costruire Applicazioni Moderne con AWS
 
Come spendere fino al 90% in meno con i container e le istanze spot
Come spendere fino al 90% in meno con i container e le istanze spot Come spendere fino al 90% in meno con i container e le istanze spot
Come spendere fino al 90% in meno con i container e le istanze spot
 
Open banking as a service
Open banking as a serviceOpen banking as a service
Open banking as a service
 
Rendi unica l’offerta della tua startup sul mercato con i servizi Machine Lea...
Rendi unica l’offerta della tua startup sul mercato con i servizi Machine Lea...Rendi unica l’offerta della tua startup sul mercato con i servizi Machine Lea...
Rendi unica l’offerta della tua startup sul mercato con i servizi Machine Lea...
 
OpsWorks Configuration Management: automatizza la gestione e i deployment del...
OpsWorks Configuration Management: automatizza la gestione e i deployment del...OpsWorks Configuration Management: automatizza la gestione e i deployment del...
OpsWorks Configuration Management: automatizza la gestione e i deployment del...
 
Microsoft Active Directory su AWS per supportare i tuoi Windows Workloads
Microsoft Active Directory su AWS per supportare i tuoi Windows WorkloadsMicrosoft Active Directory su AWS per supportare i tuoi Windows Workloads
Microsoft Active Directory su AWS per supportare i tuoi Windows Workloads
 
Computer Vision con AWS
Computer Vision con AWSComputer Vision con AWS
Computer Vision con AWS
 
Database Oracle e VMware Cloud on AWS i miti da sfatare
Database Oracle e VMware Cloud on AWS i miti da sfatareDatabase Oracle e VMware Cloud on AWS i miti da sfatare
Database Oracle e VMware Cloud on AWS i miti da sfatare
 
Crea la tua prima serverless ledger-based app con QLDB e NodeJS
Crea la tua prima serverless ledger-based app con QLDB e NodeJSCrea la tua prima serverless ledger-based app con QLDB e NodeJS
Crea la tua prima serverless ledger-based app con QLDB e NodeJS
 
API moderne real-time per applicazioni mobili e web
API moderne real-time per applicazioni mobili e webAPI moderne real-time per applicazioni mobili e web
API moderne real-time per applicazioni mobili e web
 
Database Oracle e VMware Cloud™ on AWS: i miti da sfatare
Database Oracle e VMware Cloud™ on AWS: i miti da sfatareDatabase Oracle e VMware Cloud™ on AWS: i miti da sfatare
Database Oracle e VMware Cloud™ on AWS: i miti da sfatare
 
Tools for building your MVP on AWS
Tools for building your MVP on AWSTools for building your MVP on AWS
Tools for building your MVP on AWS
 
How to Build a Winning Pitch Deck
How to Build a Winning Pitch DeckHow to Build a Winning Pitch Deck
How to Build a Winning Pitch Deck
 
Building a web application without servers
Building a web application without serversBuilding a web application without servers
Building a web application without servers
 
Fundraising Essentials
Fundraising EssentialsFundraising Essentials
Fundraising Essentials
 
AWS_HK_StartupDay_Building Interactive websites while automating for efficien...
AWS_HK_StartupDay_Building Interactive websites while automating for efficien...AWS_HK_StartupDay_Building Interactive websites while automating for efficien...
AWS_HK_StartupDay_Building Interactive websites while automating for efficien...
 
Introduzione a Amazon Elastic Container Service
Introduzione a Amazon Elastic Container ServiceIntroduzione a Amazon Elastic Container Service
Introduzione a Amazon Elastic Container Service
 

Recently uploaded

Recently uploaded (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 

(DEV301) Automating AWS with the AWS CLI

  • 1. © 2015, Amazon Web Services, Inc. or its Affiliates. All rights reserved. James Saryerwinnie October 2015 Automating AWS with the AWS CLI DEV301
  • 2. AWS Command Line Interface Unified tool to manage your AWS services
  • 3. $ git show 1.0.0 tag 1.0.0 Tagger: James Saryerwinnie <js@jamesls.com> Date: Mon Sep 2 18:38:51 2013 -0700 Tagging 1.0.0 release. commit 7fbdac0b19ea9dcc0380242068af20ef425ac5c3 Merge: 6f76721 469bab6 Author: James Saryerwinnie <js@jamesls.com> Date: Mon Sep 2 18:38:51 2013 -0700 Merge branch 'release-1.0.0' * release-1.0.0: Bumping version to 1.0.0
  • 5. Shell scripts#!/bin/bash import_key_pair() { echo -n "Would you like to import ~/.ssh/id_rsa.pub? [y/N]: " read confirmation if [[ "$confirmation" != "y" ]] then return fi aws ec2 import-key-pair --key-name id_rsa --public-key-material file://~/.ssh/id_rsa.pub } create_instance_profile() { echo -n "Would you like to create an IAM instance profile? [y/N]: " read confirmation if [[ "$confirmation" != "y" ]]; then return fi aws iam create-role --role-name dev-ec2-instance --assume-role-policy-document "$TRUST_POLICY" || errexit "Could not create Role" # Use a managed policy policies=$(aws iam list-policies --scope AWS) admin_policy_arn=$(jp -u "Policies[?PolicyName=='AdministratorAccess'].Arn | [0]" <<< "$policies") aws iam attach-role-policy --role-name dev-ec2-instance --policy-arn "$admin_policy_arn" || errexit "Could not attach role policy" # Then we need to create an instance profile from the role. aws iam create-instance-profile --instance-profile-name dev-ec2-instance || errexit "Could not create instance profile." # And add it to the role aws iam add-role-to-instance-profile --role-name dev-ec2-instance --instance-profile-name dev-ec2-instance || errexit "Could not add role to instance profile." } compute_key_fingerprint() { # Computes the fingerprint of a public SSH key given a private # RSA key. This can be used to compare against the output given # from aws ec2 describe-key-pair. openssl pkey -in ~/.ssh/id_rsa -pubout -outform DER | openssl md5 -c | cut -d = -f 2 | tr -d '[:space:]' } do_setup() { echo "Checking for required resources..." echo "" # 1. Check if a security group is found for # both windows and non-windows tags. # If not, we'll eventually give the option to # configure this. if resource_exists "aws ec2 describe-security-groups --filter Name=tag:dev-ec2-instance,Values=non-windows"; then echo "Security groups exists." else echo "Security group not found." fi echo "" # 2. Make sure the keypair is imported. if [[ ! -f ~/.ssh/id_rsa ]]; then echo "Missing ~/.ssh/id_rsa key pair." elif has_new_enough_openssl; then fingerprint=$(compute_key_fingerprint ~/.ssh/id_rsa) if resource_exists "aws ec2 describe-key-pairs --filter Name=fingerprint,Values=$fingerprint"; then echo "Key pair exists." else echo "~/.ssh/id_rsa key pair does not appear to be imported." import_key_pair fi else echo "Can't check if SSH key has been imported." echo "You need at least openssl 1.0.0 that has a "pkey" command." echo "Please upgrade your version of openssl." fi echo "" # 3. Check that they have an IAM role called dev-ec2-instance. # There is no server side filter for this like we have with the EC2 # APIs, so we have to manually use a --query option for us. if resource_exists "aws iam list-instance-profiles" "length(InstanceProfiles[?InstanceProfileName=='dev-ec2-instance'])"; then echo "Instance profile exists." else echo "Missing IAM instance profile 'dev-ec2-instance'" create_instance_profile fi echo "" } do_setup
  • 7. aws s3 ls Application with an AWS SDK Shell Scripts – what we’ll cover
  • 8. A good shell script • < 100 SLOC • Commands in sequence • Piping input/output • Simple domain logic
  • 9. • Familiar with AWS CLI • Familiar with bash • Familiar with AWS Prerequisites
  • 10. $ aws ec2 describe-instances --filters Name=architecture,Values=x86_64 $ du $(ls | grep cli) | sort -nr | tail -2 Amazon S3Amazon EC2 Prerequisites
  • 11. Getting up to speed • Becoming a Command Line Expert with the AWS CLI • Advanced Usage of the AWS CLI • Installation • Configuration
  • 12. $ We will be in the terminal…
  • 13. $ We will be in the terminal…a lot
  • 15. Main patterns • Single output to a single command • Map list output to N AWS CLI commands • Storing JSON documents and querying later • Resource exists check
  • 16. Main patterns • Single output to a single command • Map list output to N AWS CLI commands • Storing JSON documents and querying later • Resource exists check
  • 17. Output to a single parameter
  • 18. Output to a single parameter $ aws ec2 describe… { "Reservations": [ { "Groups": [ { "GroupId": "sg-abc", "GroupName": "Windows" } ], "Instances": [ { "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "AttachTime": "2015-01-29T21:22:17.000Z", "DeleteOnTermination": true, "Status": "attached", $ aws ec2 run… --foo <here>
  • 19. Output to a single parameter aws ec2 create-tags --tags Key=purpose,Value=dev --resources $(aws ec2 run-instances --image-id ami-12345 --query Instances[].InstanceId --output text)
  • 20. Output to a single parameter aws ec2 create-tags --tags Key=purpose,Value=dev --resources $(aws ec2 run-instances --image-id ami-12345 --query Instances[].InstanceId --output text) Error handling
  • 21. Output to a single parameter instance_ids=$(aws ec2 run-instances --image-id ami-12345 --query Instances[].InstanceId --output text) || errexit "Could not run instance" aws ec2 create-tags --tags Key=purpose,Value=dev --resources "$(instance_ids)" || errexit "<errmsg>"
  • 22. Output to a single parameter instance_ids=$(aws ec2 run-instances --image-id ami-12345 --query Instances[].InstanceId --output text) || errexit "Could not run instance" aws ec2 create-tags --tags Key=purpose,Value=dev --resources "$(instance_ids)" || errexit "<errmsg>"
  • 23. Output to a single parameter instance_ids=$(aws ec2 run-instances --image-id ami-12345 --query Instances[].InstanceId --output text) || errexit "Could not run instance" aws ec2 create-tags --tags Key=purpose,Value=dev --resources "$(instance_ids)" || errexit "<errmsg>"
  • 24. Output to a single parameter • Used to map one part of the output to one part of the input • Use --query and --output text • Make sure to handle the error case before using the value
  • 25. Main Patterns • Single output to a single command • Map list output to N AWS CLI commands • Storing JSON documents and querying later • Resource exists check
  • 26. Mapping one output to N AWS calls
  • 27. Mapping one output to N AWS calls $ aws iam list… [ "a", "b", ”c", "d", "e" ] $ aws iam … --foo <here> $ aws iam … --foo <here> $ aws iam … --foo <here> $ aws iam … --foo <here> $ aws iam … --foo <here>
  • 28. Mapping one output to N AWS calls for name in $(aws iam list-users --query "Users[].[UserName]" --output text); do aws iam delete-user --user-name "$name" done
  • 29. Mapping one output to N AWS calls for name in $(aws iam list-users --query "Users[].[UserName]" --output text); do aws iam delete-user --user-name "$name" done User1 User2 User3 User4 User5
  • 30. Mapping one output to N AWS calls for name in $(aws iam list-users --query "Users[].[UserName]" --output text); do aws iam delete-user --user-name "$name" done
  • 31. Mapping one output to N AWS calls aws iam list-users --query "Users[].[UserName]" --output text | xargs -I {} -P 10 aws iam delete-user --user-name "{}"
  • 32. Mapping one output to N AWS calls aws iam list-users --query "Users[].[UserName]" --output text | xargs -I {} -P 10 aws iam delete-user --user-name "{}"
  • 33. Mapping one output to N AWS calls aws iam list-users --query "Users[].[UserName]" --output text | xargs -I {} -P 10 aws iam delete-user --user-name "{}" Parallel
  • 34. Mapping one output to N AWS calls -+= 72730 james -bash -+- 76343 james xargs -I {} –P 9 aws iam delete-user --user-name {} |--- 76348 james aws iam delete-user --user-name user1 |--- 76349 james aws iam delete-user --user-name user2 |--- 76350 james aws iam delete-user --user-name user3 |--- 76351 james aws iam delete-user --user-name user4 |--- 76352 james aws iam delete-user --user-name user5 |--- 76353 james aws iam delete-user --user-name user6 |--- 76354 james aws iam delete-user --user-name user7 |--- 76355 james aws iam delete-user --user-name user8 --- 76356 james aws iam delete-user --user-name user9
  • 35. Mapping one output to N AWS calls • Use a for loop for functions • If you’re using xargs, use -I {} • Use xargs –P N parallel execution • Use “.[UserName]” instead of “.UserName” to get newline separated output.. • This works because nothing is written to stdout on error
  • 36. Demo
  • 37. Main patterns  Single output to a single command  Map list output to N AWS CLI commands • Storing JSON documents and querying later • Resource exists check
  • 38. Saving the entire output for querying later { "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "AttachTime": "2015-01-29T21:22:17.000Z", "DeleteOnTermination": true, "Status": "attached", "VolumeId": "vol-12345" } }, { "DeviceName": "xvdg", "Ebs": { "AttachTime": "2015-09-17T19:14:27.000Z", "DeleteOnTermination": false, "Status": "attached", "VolumeId": "vol-12345" } } ], "ClientToken": "12345", "EbsOptimized": false, "Hypervisor": "xen", "IamInstanceProfile": { "Arn": "arn:aws:iam::12345", "Id": "12345" }, "ImageId": "ami-12345", "InstanceId": "i-12345", "InstanceType": "m3.large", "KeyName": "id_rsa", "LaunchTime": "2015-09-17T17:24:13.000Z", "Monitoring": { "State": "disabled" }, } instance =
  • 39. Saving the entire output for querying later { "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "AttachTime": "2015-01-29T21:22:17.000Z", "DeleteOnTermination": true, "Status": "attached", "VolumeId": "vol-12345" } }, { "DeviceName": "xvdg", "Ebs": { "AttachTime": "2015-09-17T19:14:27.000Z", "DeleteOnTermination": false, "Status": "attached", "VolumeId": "vol-12345" } } ], "ClientToken": "12345", "EbsOptimized": false, "Hypervisor": "xen", "IamInstanceProfile": { "Arn": "arn:aws:iam::12345", "Id": "12345" }, "ImageId": "ami-12345", "InstanceId": "i-12345", "InstanceType": "m3.large", "KeyName": "id_rsa", "LaunchTime": "2015-09-17T17:24:13.000Z", "Monitoring": { "State": "disabled" }, } instance = query $instance BlockDeviceMappings[0].VolumeId
  • 40. Saving the entire output for querying later { "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "AttachTime": "2015-01-29T21:22:17.000Z", "DeleteOnTermination": true, "Status": "attached", "VolumeId": "vol-12345" } }, { "DeviceName": "xvdg", "Ebs": { "AttachTime": "2015-09-17T19:14:27.000Z", "DeleteOnTermination": false, "Status": "attached", "VolumeId": "vol-12345" } } ], "ClientToken": "12345", "EbsOptimized": false, "Hypervisor": "xen", "IamInstanceProfile": { "Arn": "arn:aws:iam::12345", "Id": "12345" }, "ImageId": "ami-12345", "InstanceId": "i-12345", "InstanceType": "m3.large", "KeyName": "id_rsa", "LaunchTime": "2015-09-17T17:24:13.000Z", "Monitoring": { "State": "disabled" }, } instance = query $instance ImageId query $instance BlockDeviceMappings[0].VolumeId
  • 41. Saving the entire output for querying later { "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "AttachTime": "2015-01-29T21:22:17.000Z", "DeleteOnTermination": true, "Status": "attached", "VolumeId": "vol-12345" } }, { "DeviceName": "xvdg", "Ebs": { "AttachTime": "2015-09-17T19:14:27.000Z", "DeleteOnTermination": false, "Status": "attached", "VolumeId": "vol-12345" } } ], "ClientToken": "12345", "EbsOptimized": false, "Hypervisor": "xen", "IamInstanceProfile": { "Arn": "arn:aws:iam::12345", "Id": "12345" }, "ImageId": "ami-12345", "InstanceId": "i-12345", "InstanceType": "m3.large", "KeyName": "id_rsa", "LaunchTime": "2015-09-17T17:24:13.000Z", "Monitoring": { "State": "disabled" }, } instance = query $instance InstanceId query $instance ImageId query $instance BlockDeviceMappings[0].VolumeId
  • 42. jp – The JMESPath CLI • Same language as --query • Cross platform executable • https://github.com/jmespath/jp
  • 43. jp – The JMESPath CLI • Same language as --query • Cross platform executable • https://github.com/jmespath/jp Mac OS X brew tap jmespath/jmespath brew install jp
  • 44. Saving the entire output for querying later instance=$(aws run-instance --image-id ami-1234 --query Instances[0]) query() { jp -u "$2" <<<"$1" } instance_id=$(query "$instance" InstanceId) state_name=$(query "$instance" State.Name) instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
  • 45. Saving the entire output for querying later instance=$(aws run-instance --image-id ami-1234 --query Instances[0]) query() { jp -u "$2" <<<"$1" } instance_id=$(query "$instance" InstanceId) state_name=$(query "$instance" State.Name) instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]") instance= {"InstanceId": ”i-12345", ... }
  • 46. Saving the entire output for querying later instance=$(aws run-instance --image-id ami-1234 --query Instances[0]) query() { jp -u "$2" <<<"$1" } instance_id=$(query "$instance" InstanceId) state_name=$(query "$instance" State.Name) instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
  • 47. Saving the entire output for querying later instance=$(aws run-instance --image-id ami-1234 --query Instances[0]) query() { jp -u "$2" <<<"$1" } instance_id=$(query "$instance" InstanceId) state_name=$(query "$instance" State.Name) instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
  • 48. Saving the entire output for querying later instance=$(aws run-instance --image-id ami-1234 --query Instances[0]) query() { jp -u "$2" <<<"$1" } instance_id=$(query "$instance" InstanceId) state_name=$(query "$instance" State.Name) instance_name=$(query "$instance" "Tags[?Key=='Name'].Value | [0]")
  • 49. Saving the entire output for querying later 1. Use JSON output, not text, --output json 2. Store the entire thing as a variable, or write to a temp file if output size is a concern. 3. Use the “jp” command to filter down results as needed.
  • 50. Main Patterns  Single output to a single command  Map list output to N AWS CLI commands  Storing JSON documents and querying later • Resource exists check
  • 51. resource_exists() { } 1. Determine command to run with query 2. Run command and check errors 3. Check length of query result
  • 52. resource_exists() { local cmd local num_matches if [[ -z "$2" ]]; then cmd="$1 --query length(*[0])" else cmd="$1 --query $2" fi } 2. Run command and check errors 3. Check length of query result
  • 53. resource_exists() { num_matches=$($command) if [[ "$?" -ne 0 ]]; then echo "Could not check if resource exists, exiting." exit 2 fi } 3. Check length of query result 1. Determine command to run with query
  • 54. resource_exists() { if [[ "$num_matches" -gt 0 ]]; then # RC of 0 mean the resource exists, success. return 0 else return 1 fi } 1. Determine command to run with query 2. Run command and check errors
  • 55. Usage: Server-side filtering describe_groups="aws ec2 describe-security-groups" if resource_exists "$describe_groups --filter Name=tag:dev-ec2-instance,Values=linux"; then echo "Security groups exists." else echo "Security group not found." fi
  • 56. Usage: Client-side filtering list_profiles="aws iam list-instance-profiles" if resource_exists "$list_profiles" "InstanceProfiles[?InstanceProfileName=='dev-ec2-instance']" then echo "Instance profile exists." else echo "Missing IAM instance profile 'dev-ec2-instance'" create_instance_profile fi
  • 57. Resource exists • Check if a resource exists by filtering down a list and checking if the length is greater than 0. • Use server side filtering when possible • Use JMESPath query for client side filtering
  • 58. Demo
  • 59. Common Patterns  Single output to a single command  Map list output to N AWS CLI commands  Storing JSON documents and querying later  Resource exists check
  • 61. # * * * * * command to execute # │ │ │ │ │ # │ │ │ │ │ # │ │ │ │ └───── day of week (0 – 6) # │ │ │ └────────── month (1 - 12) # │ │ └─────────────── day of month (1 - 31) # │ └──────────────────── hour (0 - 23) # └───────────────────────── min (0 - 59) Cron
  • 63. $ whoami $HOME/.aws/config $HOME/.aws/credentials export AWS_CONFIG_FILE export AWS_SHARED_CREDENTIALS_FILE • Explicitly set AWS_CONFIG_FILE/AWS_SHARED_CREDENTIALS_FILE • Ensure user running cron job has ~/.aws/config ~/.aws/credentials
  • 64. aws configure set region $(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jp -u 'region') Configure a region
  • 65. Summary • Common patterns • Shell script examples • Deployment • Tools
  • 67. Thank you! • User guide: http://docs.aws.amazon.com/cli/latest/userguide/ • Reference docs: http://docs.aws.amazon.com/cli/latest/reference/ • JMESPath: http://jmespath.org/ • re:Invent 2014 - https://www.youtube.com/watch?v=vP56l7qThNs • re:Invent 2013 - https://www.youtube.com/watch?v=qiPt1NoyZm0