2019.02.22

AWS CLI コマンドチートシート

こんにちは、最近歯医者に行くたびに虫歯が見つかる♯です。
歯医者は定期的に行きましょう…。
AWSを使ったシステムの保守プロジェクトがいわゆる一つの区切りを迎え、
色々情報を整理していたらAWS CLIのコマンドメモがたくさん出てきたので、
コマンドチートシートシリーズ第3回はAWS CLIです。
実際の作業で使っていたコマンドなのですごくニッチですが、誰かのお役に立ったらうれしいです。

EC2

EC2インスタンスの情報を表示する

aws ec2 describe-instances --output json

そのアカウント・リージョンで起動しているEC2インスタンスの情報がjson形式で全部出てきます。
特定のインスタンスだけ見たい場合はフィルタリングしましょう。

aws ec2 describe-instances --output json --filter "Name=tag:Name,Values=web"\

上記のオプションをつけると、インスタンス名が「web」のものだけを表示できます。
さらに情報を絞り込みたい場合は、queryオプションを使います。

aws ec2 describe-instances --output json --filter "Name=tag:Name,Values=web"\ --query 'Reservations[].Instances[].[InstanceId]'

このqueryオプションは JMESPath を使っています。
コマンド実行しているサーバにjqコマンドが入っていれば、jqでもフィルタリングができます。

aws ec2 describe-instances --output json --filter "Name=tag:Name,Values=web" |jq -r '.Reservations[].Instances[].InstanceId'

力尽きたので以降はざっくり情報だけです。
詳細はAWS CLI Command Referenceを確認してください。

AMIからインスタンスを起動

インスタンスの起動もCLIを使えばコマンド一発で実行できます。

aws ec2 run-instances --image-id <AMI ID>\
 --instance-type <インスタンスタイプ>\
 --key-name <キーペア名>\
 --security-group-ids <セキュリティグループID>\
 --subnet-id <サブネットID>\
 --iam-instance-profile "Name=<IAMロール名>"\
 --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=<インスタンス名>}]'\
 'ResourceType=volume,Tags=[{Key=Name,Value=<インスタンス名>}]'

他にもオプションがありますが、上記が必要最低限なのではないかと思います。

セキュリティグループ作成

aws ec2 create-security-group --description "allow SSH from bitstar" --group-name "fromBitstar" --vpc-id <VPC ID>

セキュリティグループにインバウンドルールを追加

上のコマンドでセキュリティグループを作ったらルールを追加しましょう。
セキュリティグループIDは作成時のコマンド実行結果から拾います。

aws ec2 authorize-security-group-ingress --group-id <セキュリティグループID>\
 --ip-permissions '[{"FromPort": 80, "ToPort": 80, "IpProtocol": "tcp", "IpRanges": [{"CidrIp": "1.2.3.4/32", "Description": "bitstar"}]}]'\

IpRangesはカンマ区切りで複数指定できます。

S3

S3バケット作成

s3コマンドはオブジェクトの操作、S3自体の操作はs3apiを使うようです。

aws s3api create-bucket --bucket "hogehogefugafuga" --create-bucket-configuration LocationConstraint=ap-northeast-1

RDS

RDSインスタンスのARNを表示

aws rds describe-db-instances |jq -r '.DBInstances[].DBInstanceArn'

RDSインスタンスのタグを表示

aws rds list-tags-for-resource --resource-name <ARN>

RDSインスタンスのタグを追加・変更

aws --profile s-hata rds add-tags-to-resource\
 --tags Key=env,Value=production Key=service,Value=web\
 --resource-name <ARN>

RDSのインスタンスタイプを変更する

aws --profile s-hata rds modify-db-instance\
 --db-instance-identifier <RDSインスタンス名>\
 --db-instance-class <インスタンスクラス>\
 --apply-immediately

CloudFront

既存のCloudFrontからconfigを生成

aws cloudfront get-distribution --id <CloudFrontのID> | jq -r ".Distribution | { DistributionConfig: .DistributionConfig } | .DistributionConfig.CallerReference = `date '+%s'`" > cloudfront.json

上記コマンドで生成したconfigを使って新規CloudFrontディストリビューションを作成

aws cloudfront create-distribution --cli-input-json file://cloudfront.json

なんでこんなことをするかって?
本番環境用に作ったディストリビューションと全く同じものをステージング環境用に作りたくなったりするからです。

Autoscaling Group

autoscalingから起動したインスタンスのID一覧

aws autoscaling describe-auto-scaling-instances --query 'AutoScalingInstances[].InstanceId'

autoscalingグループごとにインスタンスIDと起動設定を一覧にする

aws autoscaling describe-auto-scaling-instances\
 --query 'AutoScalingInstances[?AutoScalingGroupName==`<AutoScalingグループ名>`].[InstanceId,LaunchConfigurationName]'\
 --output text

手動でヘルスステータスを変更する

ヘルスステータスをunhealthyに変更すると、インスタンスの入替えが発生します。

aws autoscaling set-instance-health --instance-id <インスタンスID> --health-status Unhealthy

ライフサイクルフックにSNS通知とIAMロール追加

aws autoscaling put-lifecycle-hook\
 --lifecycle-hook-name <ライフサイクルフック名>\
 --auto-scaling-group-name <AutoScalingグループ名>\
 --notification-target-arn <SNSのARN>\
 --role-arn <IAMロールのARN>

ライフサイクルフックの設定を表示

aws autoscaling describe-lifecycle-hooks\
 --auto-scaling-group-name <AutoScalingグループ名>\
 --lifecycle-hook-names <ライフサイクルフック名>

AutoScalingグループの最小・最大・希望を変更する

aws autoscaling update-auto-scaling-group\
 --auto-scaling-group-name <AutoScalingグループ名>\
 --desired-capacity <台数> --min-size <台数> --max-size <台数>

AutoScalingグループの名前と紐づく起動設定を一覧表示

aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[].[AutoScalingGroupName,LaunchConfigurationName]"

これだけあれば1つくらい誰かの役に立つコマンドがあるでしょう…。
最後に昨年のクリスマスに撮ったクラリネット族楽器大集合写真を載せて終わります。

またお会いしましょう。

一覧に戻る