SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Downloaden Sie, um offline zu lesen
© 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

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

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 Control Tower를 통한 클라우드 보안 및 거버넌스 설계 - 김학민 :: AWS 클라우드 마이그레이션 온라인
AWS Control Tower를 통한 클라우드 보안 및 거버넌스 설계 - 김학민 :: AWS 클라우드 마이그레이션 온라인AWS Control Tower를 통한 클라우드 보안 및 거버넌스 설계 - 김학민 :: AWS 클라우드 마이그레이션 온라인
AWS Control Tower를 통한 클라우드 보안 및 거버넌스 설계 - 김학민 :: AWS 클라우드 마이그레이션 온라인
 
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
 
AWS Black Belt Techシリーズ AWS SDK
AWS Black Belt Techシリーズ AWS SDKAWS Black Belt Techシリーズ AWS SDK
AWS Black Belt Techシリーズ AWS SDK
 
AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
 
20210119 AWS Black Belt Online Seminar AWS CloudTrail
20210119 AWS Black Belt Online Seminar AWS CloudTrail20210119 AWS Black Belt Online Seminar AWS CloudTrail
20210119 AWS Black Belt Online Seminar AWS CloudTrail
 
[Black Belt Online Seminar] AWS上でのログ管理
[Black Belt Online Seminar] AWS上でのログ管理[Black Belt Online Seminar] AWS上でのログ管理
[Black Belt Online Seminar] AWS上でのログ管理
 
Protecting Your Data With AWS KMS and AWS CloudHSM
Protecting Your Data With AWS KMS and AWS CloudHSM Protecting Your Data With AWS KMS and AWS CloudHSM
Protecting Your Data With AWS KMS and AWS CloudHSM
 
AWS 클라우드 기반 확장성 높은 천만 사용자 웹 서비스 만들기 - 윤석찬
AWS 클라우드 기반 확장성 높은 천만 사용자 웹 서비스 만들기 - 윤석찬AWS 클라우드 기반 확장성 높은 천만 사용자 웹 서비스 만들기 - 윤석찬
AWS 클라우드 기반 확장성 높은 천만 사용자 웹 서비스 만들기 - 윤석찬
 
AWS Black Belt Online Seminar Amazon EC2
AWS Black Belt Online Seminar Amazon EC2AWS Black Belt Online Seminar Amazon EC2
AWS Black Belt Online Seminar Amazon EC2
 
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
 
AWS VM import / export ハンズオン
AWS VM import / export ハンズオンAWS VM import / export ハンズオン
AWS VM import / export ハンズオン
 
CloudWatch Logsについて
CloudWatch LogsについてCloudWatch Logsについて
CloudWatch Logsについて
 
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingCloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
 
(DVO202) DevOps at Amazon: A Look At Our Tools & Processes
(DVO202) DevOps at Amazon: A Look At Our Tools & Processes(DVO202) DevOps at Amazon: A Look At Our Tools & Processes
(DVO202) DevOps at Amazon: A Look At Our Tools & Processes
 
AWS Infrastructure as Code - September 2016 Webinar Series
AWS Infrastructure as Code - September 2016 Webinar SeriesAWS Infrastructure as Code - September 2016 Webinar Series
AWS Infrastructure as Code - September 2016 Webinar Series
 
20191023 AWS Black Belt Online Seminar Amazon EMR
20191023 AWS Black Belt Online Seminar Amazon EMR20191023 AWS Black Belt Online Seminar Amazon EMR
20191023 AWS Black Belt Online Seminar Amazon EMR
 
AWS Summit Seoul 2023 | 갤럭시 규모의 서비스를 위한 Amazon DynamoDB의 역할과 비용 최적화 방법
AWS Summit Seoul 2023 | 갤럭시 규모의 서비스를 위한 Amazon DynamoDB의 역할과 비용 최적화 방법AWS Summit Seoul 2023 | 갤럭시 규모의 서비스를 위한 Amazon DynamoDB의 역할과 비용 최적화 방법
AWS Summit Seoul 2023 | 갤럭시 규모의 서비스를 위한 Amazon DynamoDB의 역할과 비용 최적화 방법
 
基礎から学ぶ? EC2マルチキャスト
基礎から学ぶ? EC2マルチキャスト基礎から学ぶ? EC2マルチキャスト
基礎から学ぶ? EC2マルチキャスト
 
OpenStack Ironic - Bare Metal-as-a-Service
OpenStack Ironic - Bare Metal-as-a-ServiceOpenStack Ironic - Bare Metal-as-a-Service
OpenStack Ironic - Bare Metal-as-a-Service
 

Andere mochten auch

Andere mochten auch (14)

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)
 
Becoming a Command Line Expert with the AWS CLI (TLS304) | AWS re:Invent 2013
Becoming a Command Line Expert with the AWS CLI (TLS304) | AWS re:Invent 2013Becoming a Command Line Expert with the AWS CLI (TLS304) | AWS re:Invent 2013
Becoming a Command Line Expert with the AWS CLI (TLS304) | AWS re:Invent 2013
 
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
 

Ähnlich wie (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
 

Ähnlich wie (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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Kürzlich hochgeladen (20)

Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
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
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
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...
 
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
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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?
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
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
 

(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