awscliのよく使うコマンド

AWSを触り始めて2年ぐらいになります。awscliは普段どんなコマンドを使っているのか、ふとコマンド実行履歴から振り返ってみました。

以下のコマンドで私の実行履歴を見て、目についたものを本記事にまとめました。

```shell
$ cat ~/.zsh_history | perl -nle '/^[^;]*;(.+)$/ and print $1' | perl -nle '/^aws --profile \S+ (.+)$/ and print $1 or /^aws (.+)$/ and print $1;' | LC_ALL=C sort | less
```

# S3関連

awscliで一番多いのがS3関連でした。

## S3のオブジェクト一覧

lsコマンドとよく使うオプションや、よく使う他のコマンドとの組み合わせ。
wcはオブジェクトの数を数えてます。grepはファイル名で検索しています。

```shell
$ aws s3 ls
$ aws s3 ls S3_BUCKET
$ aws s3 ls s3://S3_BUCKET/S3_PREFIX/
$ aws s3 ls --human s3://S3_BUCKET/S3_PREFIX/
$ aws s3 ls --recursive s3://S3_BUCKET/S3_PREFIX/
$ aws s3 ls --recursive s3://S3_BUCKET/S3_PREFIX/ | wc -l
$ aws s3 ls --recursive s3://S3_BUCKET/S3_PREFIX/ | grep PATTERN
```

バケットのバージョニング設定をしている場合で、過去バージョンも含めてオブジェクトの一覧を見たい場合。

```shell
$ aws s3api list-object-versions --bucket S3_BUCKET --prefix S3_KEY
$ aws s3api list-object-versions --bucket S3_BUCKET --prefix S3_PREFIX/
```

## S3オブジェクト閲覧

lessコマンドで表示するコマンド。gzで圧縮されている場合はgunzip併用。JSONの場合はjqコマンド併用で見やすくします。

```shell
$ aws s3 cp s3://S3_BUCKET/S3_KEY -
$ aws s3 cp s3://S3_BUCKET/S3_KEY - | less
$ aws s3 cp s3://S3_BUCKET/S3_KEY.gz - | gunzip | less
$ aws s3 cp s3://S3_BUCKET/S3_KEY.json.gz - | gunzip | jq . -C | less -SRXF
```

ローカルにコピーしてからゆっくり見てもよいです。tarファイルはローカルに展開してから見たほうが楽。

```shell
$ aws s3 cp s3://S3_BUCKET/S3_KEY LOCAL_FILE
$ aws s3 cp --recursive s3://S3_BUCKET/S3_PREFIX/ LOCAL_DIR/
$ aws s3 cp s3://S3_BUCKET/S3_KEY.tar.gz - | tar xvzf -
```

## S3オブジェクト作成

ローカルにあるファイルをS3にコピー。s3apiはあまり使わない。

```shell
$ aws s3 cp LOCAL_FILE s3://S3_BUCKET/S3_KEY
$ aws s3api put-object --bucket S3_BUCKET --key sample2/aaa/1 --body test.txt
```

`/` で終わるキーのオブジェクトを作成するには、s3コマンドではなくs3apiコマンドが必要です。以下のコマンドはサイズ0のオブジェクトを作成しますが、フォルダがあるかのように見せかけるときによく使います。

```shell
$ aws s3api put-object --bucket S3_BUCKET --key S3_PREFIX/
```

既存のS3オブジェクトを編集する方法は、以前に記事に書きました。

- [S3にあるテキストファイルをサクッと編集するには - Qiita](https://qiita.com/suzuki-navi/items/9fdf34163b9915bcaeb7)

## S3オブジェクトコピー

バケット内でオブジェクトのコピー、バケットをまたいだコピー、異なるAWSアカウントなどでプロファイルをまたいだコピー。

```shell
$ aws s3 cp s3://S3_BUCKET/S3_KEY s3://S3_BUCKET/OTHER_S3_KEY
$ aws s3 cp s3://S3_BUCKET/S3_KEY s3://OTHER_S3_BUCKET/OTHER_S3_KEY
$ aws --profile PROFILE s3 cp s3://S3_BUCKET/S3_KEY - | aws --profile OTHER_PROFILE s3 cp - s3://OTHER_S3_BUCKET/OTHER_S3_KEY
```

フォルダまるごとコピー。

```shell
$ aws s3 cp --recursive s3://S3_BUCKET/S3_PREFIX/ s3://S3_BUCKET/OTHER_S3_PREFIX/
$ aws s3 cp --recursive s3://S3_BUCKET/S3_PREFIX/ s3://OTHER_S3_BUCKET/OTHER_S3_PREFIX/
```

## S3オブジェクトのキーをリネーム

```shell
$ aws s3 mv s3://S3_BUCKET/S3_KEY s3://S3_BUCKET/OTHER_S3_KEY
$ aws s3 mv --recursive s3://S3_BUCKET/S3_PREFIX/ s3://S3_BUCKET/OTHER_S3_PREFIX/
```

## S3オブジェクトを削除

```shell
$ aws s3 rm s3://S3_BUCKET/S3_KEY
$ aws s3 rm --recursive s3://S3_BUCKET/S3_PREFIX/
$ aws s3 rm --recursive --quiet s3://S3_BUCKET/S3_PREFIX/

```

## S3バケットの各種設定

```shell
$ aws s3api list-bucket-analytics-configurations --bucket BUCKET_NAME
$ aws s3api get-bucket-analytics-configuration --bucket BUCKET_NAME --id CONFIGURATION_ID
$ aws s3api put-bucket-analytics-configuration --bucket BUCKET_NAME --id CONFIGURATION_ID --analytics-configuration JSON_STRING
```

```shell
$ aws s3api get-bucket-encryption --bucket BUCKET_NAME
```

```shell
$ aws s3api list-bucket-inventory-configurations --bucket BUCKET_NAME
$ aws s3api get-bucket-inventory-configuration --bucket BUCKET_NAME --id CONFIGURATION_ID
$ aws s3api put-bucket-inventory-configuration --bucket BUCKET_NAME --id CONFIGURATION_ID --inventory-configuration JSON_STRING
```

```shell
$ aws s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME
```

```shell
$ aws s3api get-bucket-logging --bucket BUCKET_NAME
```

```shell
$ aws s3api list-bucket-metrics-configurations --bucket BUCKET_NAME
$ aws s3api get-bucket-metrics-configuration --bucket BUCKET_NAME --id CONFIGURATION_ID
$ aws s3api put-bucket-metrics-configuration --bucket BUCKET_NAME --id CONFIGURATION_ID --metrics-configuration JSON_STRING
```

```shell
$ aws s3api get-bucket-policy --bucket S3_BUCKET | jq '.Policy' -r | jq . -C | less -SRXF
```

```shell
$ aws s3api get-bucket-versioning --bucket S3_BUCKET
```

# CloudFormation

```shell
$ aws cloudformation package --template-file TEMPLATE_FILE --output-template-file OUTPUT_FILE
$ aws cloudformation deploy --template-file TEMPLATE_FILE --stack-name STACK_NAME
$ aws cloudformation describe-stacks --stack-name STACK_NAME | jq -r '.Stacks[0].Outputs[0].OutputValue'
$ aws cloudformation describe-stack-events --stack-name STACK_NAME
$ aws cloudformation delete-stack --stack-name STACK_NAME
```

デプロイ済みスタックのテンプレートを取得するにはget-templateコマンド。ただ、YAMLなのかJSONなのか、デプロイ時といま見たいのがどちらのフォーマットなのかで、どうしたらいいかは以前に記事に書きました。

```shell
$ aws cloudformation get-template --stack-name STACK_NAME
```

- [AWS CloudFormationのデプロイ済みスタックのテンプレートを取得 - Qiita](https://qiita.com/suzuki-navi/items/b901ec9741253dfa7ecb)

# Lambda

一覧取得。

```shell
$ aws lambda list-functions
$ aws lambda list-functions | jq -C ".Functions[].FunctionName" -r
```

Lambdaの情報取得。2つ目のコマンドは、Lambdaのソースコード取得。

```shell
$ aws lambda get-function --function-name FUNCTION_NAME
$ aws s3 cp "$(aws lambda get-function --function-name FUNCTION_NAME | jq .Code.Location -r)" LOCAL_FILENAME.zip
```

Lambda実行。

```shell
$ aws lambda invoke --function-name FUNCTION_NAME /dev/null
$ aws lambda invoke --function-name FUNCTION_NAME /dev/stdout
```

# CloudWatch Logs

ロググループ関係。

```shell
$ aws logs create-log-group --log-group-name LOG_GROUP_NAME
$ aws logs delete-log-group --log-group-name LOG_GROUP_NAME
$ aws logs describe-log-groups --log-group-name-prefix LOG_GROUP_NAME
$ aws logs put-retention-policy --log-group-name LOG_GROUP_NAME --retention-in-days NUMBER
```

ログ自体をCUIで見るときは私はawslogsコマンドを使っています。

- [GitHub - jorgebastida/awslogs: AWS CloudWatch logs for Humans™](https://github.com/jorgebastida/awslogs)

# IAM

IAM関係を見るコマンド。

```shell
$ aws iam get-user --user-name USER_NAME
$ aws iam list-attached-user-policies --user-name USER_NAME
$ aws iam get-user-policy --user-name USER_NAME --policy-name POLICY_NAME
$ aws iam list-roles
$ aws iam get-role --role-name ROLE_NAME
$ aws iam get-policy --policy-arn POLICY_ARN
```

IAMポリシーをawscliでいじる方法は、以前に記事に書きました。

- [AWS IAM Policyをawscliで作成・取得・更新 - suzuki-navi’s blog](https://suzuki-navi.hatenablog.com/entry/2021/01/12/105131)

次はインスタンスプロファイル関係。

```shell
$ aws iam list-instance-profiles
$ aws iam get-instance-profile --instance-profile-name INSTANCE_PROFILE_NAME
```

# EC2

EC2を操作する機会は私は少ないです。こんなコマンド履歴は見つかりました。

```shell
$ aws ec2 describe-instances
$ aws ec2 describe-instances --instance_ids INSTANCE_ID
$ aws ec2 describe-network-interfaces
$ aws ec2 describe-network-interfaces | jq '.NetworkInterfaces[] | [.VpcId, .AvailabilityZone, .SubnetId, .PrivateIpAddress, .RequesterId, .Attachment.InstanceId] | @tsv'
$ aws ec2 describe-security-groups
$ aws ec2 describe-subnets
```

# RDS

RDS関係。

```shell
$ aws rds describe-db-instances
$ aws rds describe-db-instances --db-instance-identifier INSTANCE_ID
$ aws rds describe-db-parameter-groups
$ aws rds describe-db-parameter-groups --db-parameter-group-name PARAMETER_GROUP_NAME
$ aws rds describe-db-parameters --db-parameter-group-name PARAMETER_GROUP_NAME
```

RDSのインスタンスにあるログを見る方法は以前に記事を書きました。

- [AWS RDSのログファイルを高速にダウンロードするスクリプト - Qiita](https://qiita.com/suzuki-navi/items/fdabc8bc82d7183a05f3)

# Redshift

RDSもRedshiftも、インスタンス自体をどうにかする場合はマネジメントコンソールで済ますことが多く、また中身のデータに対してクエリを投げたい場合はpsqlコマンドを使うことが多いです。従ってawscliでの実行履歴は少ないです。

```shell
$ aws redshift describe-clusters
$ aws redshift describe-clusters --cluster-identifier CLUSTER_IDENTIFIER
```

# Glue

データカタログ。

```shell
$ aws glue get-tables --database-name DATABASE_NAME
$ aws glue get-tables --database-name DATABASE_NAME | jq '.TableList[].Name' -r
$ aws glue get-table --database-name DATABASE_NAME --name TABLE_NAME
```

クローラ。

```shell
$ aws glue get-crawler --name CRAWLER_NAME
$ aws glue get-crawler --name CRAWLER_NAME | jq '.Crawler.State' -r
$ aws glue get-crawler --name CRAWLER_NAME | jq '.Crawler.Targets.JdbcTargets[] | .Path' -r
$ aws glue get-crawlers
$ aws glue start-crawler --name CRAWLER_NAME
```

コネクション。

```shell
$ aws glue get-connection --name CONNECTION_NAME
```

ジョブ。

```shell
$ aws glue list-jobs --max-results 1000
$ aws glue list-jobs --max-results 1000 | jq '.JobNames[]' -r
$ aws glue get-jobs
$ aws glue get-jobs | jq -r ".Jobs[] | .Name"
$ aws glue get-job --job-name JOB_NAME
$ aws glue delete-job --job-name JOB_NAME
$ aws glue start-job-run --job-name JOB_NAME
```

# Step Functions

Step Functionsの実行をawscliからキックしてました。

```shell
$ aws stepfunctions start-execution --state-machine-arn STATE_MACHINE_ARN
$ aws stepfunctions list-executions --state-machine-arn STATE_MACHINE_ARN
```

# CodeCommit

レポジトリの一覧をawscliで見てました。

```shell
$ aws codecommit list-repositories
```

# その他

アクセスキーの設定とかAWSアカウントを確認できるコマンド。

```shell
$ aws configure list
$ aws sts get-caller-identity
```

以上。