56
AWS Command Line Interface (CLI) AWS Black Belt Tech Webinar 2014 (旧マイスターシリーズ) ソリューションアーキテクト 辻 義 放送:2014.10.15 最終新:2014.10.20(1.5.2)

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

Embed Size (px)

DESCRIPTION

AWS Black Belt Tech Webinar 2014 (旧マイスターシリーズ) AWS AWS Command Line Interface

Citation preview

  • 1. AWS Command Line Interface (CLI)AWS Black Belt Tech Webinar 2014 () 2014.10.15 2014.10.201.5.2

2. Agenda CLI CLI Appendix 3. CLI 4. Command Line Interface (CLI) AWS aws30 Windows, Linux, Mac, Unix S3sync 5. AWSEC2S3RDSDBCloudWatchManagementConsole (Web)AWSSDKAWS CLIREST API 6. AWS CLI20141030 AWS CloudFormation AWS Data Pipeline (Preview) AWS Direct Connect AWS Elastic Beanstalk AWS Identity and Access Management AWS Import/Export AWS OpsWorks AWS Security Token Service AWS Storage Gateway AWS Support Amazon CloudFront (Preview) Amazon CloudSearch Amazon CloudWatch Amazon DynamoDB Amazon ElastiCache Amazon Elastic Compute Cloud Amazon Elastic MapReduce (Preview) Amazon Elastic Transcoder Amazon Kinesis Amazon Redshift Amazon Relational Database Service (Beta) Amazon Route 53 Amazon Simple Email Service Amazon Simple Notification Service Amazon Simple Queue Service Amazon Storage Gateway Amazon Simple Storage Service Amazon Simple Workflow Service Auto Scaling Elastic Load Balancing 7. AWS CLISDKAWS APISDKhttp://aws.amazon.com/jp/tools/ SDK Android Java Script iOS Java .NET Node.js PHP Python Ruby IDE Eclipse Visual Studio AWS Command Line Interface Windows PowerShell 8. EC2PCawsLinuxbashsshWindows PowerShell$ aws ec2 create-key-pair --key-name 'demo-key'$ aws ec2 describe-subnets --query 'Subnets[].[VpcId,CidrBlock,SubnetId]' --output table$ aws ec2 run-instances --image-id ami-35072834 --instance-type t2.micro --key-name demo-key --count 2 9. AWS CLIOScron 10. AWS CLIPython Windows MSIAmazon Linux yumWindows, Linux, Mac,Unixpip pythonhttp://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html 11. AWS CLI#!/usr/bin/python# Copyright 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.# Licensed under the Apache License, Version 2.0 (the License). You# may not use this file except in compliance with the License. A copy of# the License is located at# http://aws.amazon.com/apache2.0/# or in the license file accompanying this file. This file is# distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF# ANY KIND, either express or implied. See the License for the specific# language governing permissions and limitations under the License.import sysimport awscli.clidriverdef main():return awscli.clidriver.main()if __name__ == '__main__':sys.exit(main()) 12. MSIWindowsPython 13. pipPython pip 1) Python2.6.5, 2.7, 3.32) pip3) pipAWS CLILinuxMac(Python$ curl https://bootstrap.pypa.io/get-pip.py | sudo python$ sudo pip install awscli$ aws --versionaws-cli/1.5.2 Python/2.7.6 Darwin/14.0.0 14. MSI MSIyum yum$ yum updatepip pip$ pip install --upgrade awscli 15. AWSAWS CLIIAMIAM IAMIAMPCIAMEC2IAMEC2IAM IAMIAMIAM Policy 16. AWS AWS CLI IAM IAMIAM IAM Policy Cloud Trail IAM PolicyIP EC2IAM rootMFAAWS Black Belt Webinar - Identity and Access Management (IAM) 17. AWS CLI aws configure SDK ~/.aws/credentials AWS CLI ~/.aws/config $ aws configureAWS Access Key ID [None]: XXXXXXXXXXXAWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXDefault region name [None]: ap-northeast-1Default output format [None]:$ cat ~/.aws/credentials[default]aws_access_key_id = XXXXXXXXXXXaws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXX$ cat ~/.aws/config[default]region = ap-northeast-1 18. ~/.aws/config~/.aws/credentials[default] [profile ][default] []AWS_DEFAULT_PROFILE--profile aws_access_key_idaws_access_key_idAWS_ACCESS_KEY_ID()aws_secret_access_keyaws_secret_access_keyAWS_SECRET_ACCESS_KEY()aws_session_tokenaws_session_tokenAWS_SESSION_TOKEN()region (credentails)AWS_DEFAULT_REGION--region output (credentails)AWS_DEFAULT_OUTPUT--output [preview](credentails)()()(config)(credentails)HTTP_PROXY,HTTPS_PROXY,NO_PROXY()aws configure list http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html 19. AWS CLI[options] [parameters] [options][parameters] -- awsaws [options] command subcommand [parameters]ec2, s3 configure, help$ aws --region ap-northeast-1 ec2 describe-instances --max-items 2 20. AWS CLIWebhttp://docs.aws.amazon.com/cli/latest/reference/index.htmlaws helpaws command helpaws commnad subcommand help 21. CLI 22. 2012.12.21 [0.4.0]Developer Preview222013. 9. 3 [1.0.0]242013.10.18 [1.2.0]--query 2014.10.6 [1.5.0]aws configure~/.aws/credentials{return:true} https://aws.amazon.com/releasenotes/CLI 23. [options] : --regionaws --region (name) [options] command subcommand [parameters]ap-northeast-1ap-southeast-1ap-southeast-2eu-west-1sa-east-1us-east-1us-west-1us-west-2http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html 24. [options] : --outputJSONaws --output (name) [options] command subcommand [parameters]jsonJSONtexttable$ aws --output table ec2 describe-regions----------------------------------------------------------| DescribeRegions |+--------------------------------------------------------+|| Regions |||+-----------------------------------+------------------+||| Endpoint | RegionName |||+-----------------------------------+------------------+||| ec2.eu-west-1.amazonaws.com | eu-west-1 |||| ec2.sa-east-1.amazonaws.com | sa-east-1 |||| ec2.us-east-1.amazonaws.com | us-east-1 |||| ec2.ap-northeast-1.amazonaws.com | ap-northeast-1 |||| ec2.us-west-2.amazonaws.com | us-west-2 |||| ec2.us-west-1.amazonaws.com | us-west-1 |||| ec2.ap-southeast-1.amazonaws.com | ap-southeast-1 |||| ec2.ap-southeast-2.amazonaws.com | ap-southeast-2 |||+-----------------------------------+------------------+| 25. [options] : --profiledefaultaws --profile (name) [options] command subcommand [parameters]$ aws --profile admin configureAWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXAWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXDefault region name [None]: ap-northeast-1Default output format [None]:$ cat ~/.aws/credentials[default]aws_access_key_id = XXXXXXXXXXXXXXXXXXXXaws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX[admin]aws_access_key_id = XXXXXXXXXXXXXXXXXXXXaws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$ cat ~/.aws/config[default]region = ap-northeast-1[profile admin]region = ap-northeast-1 26. [options] : --debugawsawsAPIaws --debug [options] command subcommand [parameters]$ aws --debug ec2 describe-regions 2 debug.log{Regions : [..........$ cat error.log2014-10-19 21:22:00,321 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.5.2 Python/2.7.6Darwin/14.0.0, botocore version: 0.66.02014-10-19 21:22:00,322 - MainThread - botocore.service - DEBUG - Creating service object for: ec22014-10-19 21:22:00,382 - MainThread - botocore.hooks - DEBUG - Event service-data-loaded.ec2: callinghandler function signature_overrides at 0x107da0e60 27. [options] : --queryawsJSONJMESPathjq JMESPath Specification http://jmespath.readthedocs.org/en/latest/specification.htmlaws --query (string) [options] command subcommand [parameters]JMESPath Specificationsearch(jmespath expr, JSON document) - return value--query --query 28. [options] : --query JSON$ aws ec2 describe-instances{Reservations: [{OwnerId: XXXXXXXXXXXX,ReservationId: r-XXXXXXXX,Groups: [],Instances: [{Monitoring: {State: enabled},PublicDnsName: null,KernelId: aki-XXXXXXXX,State: {Code: 80,Name: stopped},EbsOptimized: true,... 29. [options] : --query $ aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId, InstanceType]'[[i-XXXXXXXX,c3.2xlarge],[i-XXXXXXXX,t2.medium]] $ aws ec2 describe-instances --query 'Reservations[].Instances[].{id:InstanceId, type:InstanceType}'[{type:c3.2xlarge,id:i-XXXXXXXX},... 30. [options] : --query $ aws ec2 describe-instances --query 'Reservations[].Instances[?InstanceType==`t2.micro`].[InstanceId,InstanceType][]'[[i-XXXXXXXX,t2.medium]]$ aws ec2 describe-instances --query 'Reservations[].Instances[?contains(InstanceType,`t2`)!=`true`].[InstanceId, InstanceType][]'[[i-XXXXXXXX,t1.micro,],[i-XXXXXXXX,... 31. [options] : --query AND$ aws ec2 describe-instances --query 'Reservations[].Instances[?State.Name==`running`][] | [?State.Name==`running`].[InstanceId, InstanceType, State.Name]'[[i-XXXXXXXX,t2.micro,running],[i-XXXXXXXX,...AND$ aws ec2 describe-instances --query 'length(Reservations[].Instances[?InstanceType==`t2.micro`][InstanceId][])'8 32. [parameters] : --filterawsdescribe-*AWSAPI--queryJSONaws [options] command subcommand [parameters] --filters Name=string1,Values=string1,string2 Name=string1,Values=string1,string2ORAND*, ? 33. [parameters] : --filter$ aws ec2 describe-instances --filters 'Name=instance-type,Values=t1.*,m1.*,m2.*,c1.*,cr1.*,hi1.*' --query 'Reservations[].Instances[].[InstanceId, InstanceType, join(`,`, Tags[?Key==`Name`].Value)]' --output texti-XXXXXXXX t1.micro Bastion Hosti-XXXXXXXX m1.medium VPN Hosti-XXXXXXXX m1.xlarge Storage GatewayPJinstance-type$ aws ec2 describe-instances --filters 'Name=tag:PJ,Values=AD' 'Name=instance-state-name,Values=running' --query 'Reservations[].Instances[].[InstanceId, InstanceType, join(`,`, Tags[?Key==`Name`].Value)]' --output texti-XXXXXXXX t2.micro DC01PJAD AND i-XXXXXXXX t2.micro DC02i-XXXXXXXX t2.micro CA01 34. command : s3S3s3s3apis3 to S3, S3 to , S3 to S3 cp, mv, rm, ls, sync --recursive, --include, --exclude 35. command : s3subcommandcpaws s3 cp test.txt s3://bucket/test/mvaws s3 mv . s3://bucket/test/ --recursivermaws s3 rm s3://bucket/ --include *.tmp --recursivelsaws s3 lsaws s3 ls s3://bucket/mb (make bcuket)aws s3 mb s3://bucket/rb (remove bucket)aws s3 rm s3://bucket/ --forcesyncaws s3 sync s3://bucket/ . --deletewebsiteWebaws s3 website s3://www.example.com/ --index-document index.html 36. 0 0 decribe-*describe-*IDAmazon Web Serivces http://cloud-spiral.enpit.jp/wp-content/uploads/Slides_Koji.pdf 37. 38. bash Linux/Unixawscommandsubcommandbash$ complete -C aws_completer awstcsh$ complete aws 'p/*/`aws_completer`/'zsh$ source aws_zsh_completer.shhttp://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html 39. bash aws text bash1IFSEC2IFS=$'n' output=$(aws --output text ec2 describe-regions)for line in $output;doIFS=$'t' region_info=($line)instances=$(aws --region ${region_info[2]} --output text ec2 describe-instances --query 'Reservations[].Instances[?State.Name==`running`].InstanceId[]')if [ $instances ]; thenaws --region ${region_info[2]} ec2 stop-instances --instance-ids $instancesfidoneREGIONS ec2.eu-west-1.amazonaws.com eu-west-1REGIONS ec2.sa-east-1.amazonaws.com sa-east-1...i-xxxxxxx i-xxxxxxx i-xxxxxxx 40. PowerShell textJSONConvertFrom-JSONPoweShellConvertFrom-JSONPowerShell V3AWS Tools for PowerShellEC2$regions = aws --output text ec2 describe-regions --query 'Regions[].RegionName'ForEach($r in $regions.split()) {$instances = aws --region $r ec2 describe-instances | Out-String | ConvertFrom-Json$instances.Reservations.Instances | Where-Object { $_.State.Name -eq running } | `ForEach { aws --region $r ec2 stop-instances --instance-ids $_.InstanceId }} 41. jqawsJSONjq--queryCSV$ aws ec2 describe-instances | jq -r '@csv (.Reservations[].Instances[] |[.InstanceId, .Tags[0].Value, .PrivateIpAddress, .PublicIpAddress])'i-XXXXXXXX,[Project A] AP ,172.31.30.66, XX.XX.XX.XXi-XXXXXXXX,[Project B] DB ,172.31.32.20,jq: http://stedolan.github.io/jq/ 42. EC2URLhttp://169.254.169.254/Linux$ curl http://169.254.169.254/latest/meta-data/instance-idi-XXXXXXXXWindows Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/placement/availability-zoneap-northeast-1a: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html 43. 44. AWS CLIAWS 30980 Windows, Linux, Max, UnixOS 1 bashPowerShell SDKPowerShellAWS 45. AWS CLI http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html AWS CLI Referencehttp://docs.aws.amazon.com/cli/latest/reference/ --query Option (JMEPath)Specification: http://jmespath.readthedocs.org/en/latest/specification.htmlTutorial: http://jmespath.org/tutorial.html APIEC2http://docs.aws.amazon.com/AWSEC2/latest/APIReference/api-error-codes.htmlS3http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html 46. Appendix 47. TipsAWS CLIawsawsAWS SDK for PythonbotocoreAWS CLI: https://github.com/aws/aws-clibotocore: https://github.com/boto/botocore APIURLhttp://docs.aws.amazon.com/general/latest/gr/api-retries.htmlbotocore/retryhandler.pybotocore/data/aws/*/*.waiters.json S3awscli/customizations/s3/constants.py 48. bash: EC2 (1/4)$ aws configureAWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXAWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXDefault region name [None]: ap-northeast-1Default output format [None]: json$ ssh-keygen$ aws ec2 import-key-pair --key-name 'demo-key' --public-key-material file://~/.ssh/id_rsa.pub{KeyName: demo-key,KeyFingerprint: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX}$ aws ec2 describe-subnets --query 'Subnets[].[VpcId,CidrBlock,SubnetId]' --output table--------------------------------------------------------| DescribeSubnets |+--------------+-------------------+-------------------+| vpc-XXXXXXXX| 172.31.32.0/24 | subnet-XXXXXXXX || vpc-XXXXXXXX| 172.31.0.0/20 | subnet-AAAAAAAA || vpc-XXXXXXXX| 172.31.16.0/20 | subnet-XXXXXXXX || vpc-XXXXXXXX| 172.31.33.0/24 | subnet-XXXXXXXX |+--------------+-------------------+-------------------+ 49. bash: EC2 (2/4)$ aws ec2 describe-images --owners amazon --query 'Images[?not_null(Name)] | [?contains(Name,`amzn-ami-hvm`)].{ImageId:ImageId,Name:Name,Description:Description}.sort_by(@, Name)' --output table----------------------------------------------------------------------------------------------------| DescribeImages |+--------------------------------------------+---------------+-------------------------------------+| Description | ImageId | Name |+--------------------------------------------+---------------+-------------------------------------+| Amazon Linux AMI x86_64 HVM EBS | ami-426cd343 | amzn-ami-hvm-2012.09.0.x86_64-ebs || Amazon Linux AMI x86_64 HVM EBS | ami-fd7ef9fc | amzn-ami-hvm-2012.09.1.x86_64-ebs || Amazon Linux AMI x86_64 HVM EBS | ami-833ebe82 | amzn-ami-hvm-2013.03.0.x86_64-ebs || Amazon Linux AMI x86_64 HVM EBS | ami-2db33c2c | amzn-ami-hvm-2013.03.1.x86_64-ebs || Amazon Linux AMI x86_64 HVM EBS | ami-0961fe08 | amzn-ami-hvm-2013.09.0.x86_64-ebs || Amazon Linux AMI x86_64 HVM EBS | ami-1b1a7e1a | amzn-ami-hvm-2013.09.1.x86_64-ebs || Amazon Linux AMI x86_64 HVM S3 | ami-1f1a7e1e | amzn-ami-hvm-2013.09.1.x86_64-s3 || Amazon Linux AMI x86_64 HVM EBS | ami-eb0c6fea | amzn-ami-hvm-2013.09.2.x86_64-ebs || Amazon Linux AMI x86_64 HVM S3 | ami-c10c6fc0 | amzn-ami-hvm-2013.09.2.x86_64-s3 || Amazon Linux AMI x86_64 HVM EBS | ami-ebbfc2ea | amzn-ami-hvm-2014.03.0.x86_64-ebs || Amazon Linux AMI x86_64 HVM S3 | ami-a3bfc2a2 | amzn-ami-hvm-2014.03.0.x86_64-s3 || Amazon Linux AMI x86_64 HVM EBS | ami-bb562fba | amzn-ami-hvm-2014.03.1.x86_64-ebs || Amazon Linux AMI x86_64 HVM S3 | ami-07562f06 | amzn-ami-hvm-2014.03.1.x86_64-s3 || Amazon Linux AMI x86_64 HVM EBS | ami-29dc9228 | amzn-ami-hvm-2014.03.2.x86_64-ebs || Amazon Linux AMI 2014.03.2 x86_64 HVM GP2 | ami-df470ede | amzn-ami-hvm-2014.03.2.x86_64-gp2 || Amazon Linux AMI x86_64 HVM S3 | ami-a3c18fa2 | amzn-ami-hvm-2014.03.2.x86_64-s3 || Amazon Linux AMI 2014.09.0 x86_64 HVM EBS | ami-35072834 | amzn-ami-hvm-2014.09.0.x86_64-ebs || Amazon Linux AMI 2014.09.0 x86_64 HVM GP2 | ami-45072844 | amzn-ami-hvm-2014.09.0.x86_64-gp2 || Amazon Linux AMI 2014.09.0 x86_64 HVM S3 | ami-f70827f6 | amzn-ami-hvm-2014.09.0.x86_64-s3 |+--------------------------------------------+---------------+-------------------------------------+AMI 50. bash: EC2 (3/4)$ instances=$(aws ec2 run-instances --image-id ami-45072844 --instance-type t2.micro --subnet-idsubnet-AAAAAAAA --key-name demo-key --count 2 --query 'Instances[].InstanceId' --output text)$ echo $?0$ echo $instancesi-fde4ace4 i-fee4ace7$ aws ec2 describe-instance-status --instance-ids $instances --query 'InstanceStatuses[].[InstanceId,SystemStatus.Status, InstanceStatus.Status]' --output table------------------------------------------------| DescribeInstanceStatus |+------------+----------------+----------------+| i-a7e3abbe| initializing | initializing || i-dfe3abc6| initializing | initializing |+------------+----------------+----------------+$ aws ec2 describe-instance-status --instance-ids $instances --query 'InstanceStatuses[].[InstanceId,SystemStatus.Status, InstanceStatus.Status]' --output table----------------------------| DescribeInstanceStatus |+-------------+-----+------+| i-a7e3abbe | ok | ok || i-dfe3abc6 | ok | ok |+-------------+-----+------+ 51. bash: EC2 (4/4)$ aws ec2 create-security-group --vpc-id vpc-8c007ae4 --group-name 'Mgmt_FromMe' --description 'ssh from my'{return: true,GroupId: sg-36ca0253}$ aws ec2 authorize-security-group-ingress --group-name 'Mgmt_FromMe' --cidr `curl -s ifconfig.me`/32 --protocol tcp --port 22$ instances=($instances)$ aws ec2 modify-instance-attribute --instance-id ${instances[0]} --groups sg-36ca0253$ aws ec2 modify-instance-attribute --instance-id ${instances[1]} --groups sg-36ca0253$ aws ec2 describe-instances --instance-ids ${instances[@]} --query 'Reservations[].Instances[].[PublicIpAddress][]' --output text54.65.0.36 54.65.0.72$ ssh -l ec2-user 54.65.0.36The authenticity of host '54.65.0.36 (54.65.0.36)' can't be established.RSA key fingerprint is 0d:bd:f5:b2:aa:71:d6:72:fb:23:47:c1:8a:c0:f2:d2.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '54.65.0.36' (RSA) to the list of known hosts.__| __|_ )_| ( / Amazon Linux AMI___|___|___|... 52. PowerShell: (1/4)PS C:UsersAdministrator aws configureAWS Access Key ID [None]:AWS Secret Access Key [None]:Default region name [None]:Default output format [None]:PS C:Scripts aws configure listName Value Type Location---- ----- ---- --------profile not set None Noneaccess_key ****************YBMQ iam-rolesecret_key ****************oScl iam-roleregion not set None None 53. PowerShell: (2/4)Make-EBSSnapshotsByCLI.ps1$Tag_AutoScriptBackup = AutoScriptBackup$SaveBackupCount = 3$AZ = [string](Invoke-RestMethod http://169.254.169.254/latest/meta-data/placement/availability-zone)$Region = $AZ.Remove($AZ.Length - 1, 1)# $InstanceId = [string](Invoke-RestMethod http://169.254.169.254/latest/meta-data/instance-id)$Volumes = @{}ForEach($i in $(aws --region $Region ec2 describe-instances --instance-ids $InstanceId `--query 'Reservations[].Instances[].BlockDeviceMappings[].[DeviceName, Ebs.VolumeId]' --output text)) {$DeviceName, $VolumeId = $i.Split()$Volumes.Add($DeviceName, $VolumeId)}# Disk 0# CGet-Disk | Where-Object Number -ne 0 | Set-Disk -IsOffline $True$SnapshotIds = @()ForEach($k in $Volumes.Keys) {$Description = Created by Make-EBSSnapshotsByCLI.ps1 (${InstanceId}:$k)$SnapshotId = aws --region $Region ec2 create-snapshot --volume-id $Volumes[$k] `--description $Description --query 'SnapshotId' --output text 54. PowerShell: (3/4)Make-EBSSnapshotsByCLI.ps1Write-Host Created $SnapshotId ($Description)$SnapshotIds += $SnapshotId}Get-Disk | Where-Object IsOffline -eq $True | Set-Disk -IsOffline $False# $InstanceName = aws --region $Region ec2 describe-instances --instance-ids $InstanceId `--query 'Reservations[].Instances[].[join(`,`, Tags[?Key==`Name`].Value)]' --output textForEach($s in $SnapshotIds) {aws --region $Region ec2 create-tags --resources $s --tags Key=Name,Value=`'EC2=${InstanceName}`' `Key=${Tag_AutoScriptBackup},Value=True}# ForEach($v in $Volumes.Values) {$AllSnapshots = aws --region $Region ec2 describe-snapshots --filters Name=volume-id,Values=$v `--query Snapshots[].{SnapshotId:SnapshotId, Description:Description, `StartTime:StartTime}.sort_by(@, StartTime)[].[SnapshotId] --output text$AutoSnapshots = @()ForEach($s in $AllSnapshots) {$auto = aws --region $Region ec2 describe-tags --filters Name=resource-id,Values=$s `--query Tags[?Key==``${Tag_AutoScriptBackup}``][Value] --output text 55. PowerShell: (4/4)Make-EBSSnapshotsByCLI.ps1If($auto -eq True) {$AutoSnapshots += $s}}$CountDelete = $AutoSnapshots.Length - $SaveBackupCountIf($CountDelete -gt 0) {ForEach($s in $AutoSnapshots[0..$($CountDelete-1)]) {Write-Host Removing $s for $vaws --region $Region ec2 delete-snapshot --snapshot-id $s}}} 56. Tips: AWS CLI bash aws --query ` PowerShell bash ` AWS CLI