GitHub Copilot in the CLI はどこまで AWS を操作できるか

## はじめに

GitHub Copilot in the CLI が 賢いので、　 AWS CLI をどこまで操作できるのか試してみました

## GitHub Copilot in the CLI の導入方法

### 機能の有効化

まずは GitHub Copilot を使えるようにしましょう

https://qiita.com/RyoWakabayashi/items/1207128e88669c76bf5f#github-copilot-%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%BE%E3%81%A7

また、個人もしくは組織の設定から GitHub Copilot in the CLI を有効化してください

https://docs.github.com/en/copilot/github-copilot-in-the-cli/enabling-github-copilot-in-the-cli

### GitHub CLI のインストール

GitHub Copilot in the CLI は GitHub CLI の拡張機能として提供されます

まずは GitHub CLI をインストールしましょう

https://github.com/cli/cli#installation

macOS の場合は Homebrew が一番簡単ですね

```bash
brew install gh
```

インストールしたら認証しておきましょう

```bash
gh auth login
```

### GitHub Copilot in the CLI の拡張機能追加

GitHub CLI の拡張機能として Copilot を追加します

https://docs.github.com/en/copilot/github-copilot-in-the-cli/using-github-copilot-in-the-cli#installing-copilot-in-the-cli

```bash
gh extension install github/gh-copilot
```

### GitHub Copilot in the CLI の 基本的な使い方

`gh copilot suggest -t shell` で「やりたいこと」ができるシェルコマンドを返してくれます

:::note info
`-t git` なら git コマンド、 `-t gh` なら GitHub CLI のコマンドを返してくれます
:::

しかも日本語を理解してくれます

```bash
$ gh copilot suggest -t shell "macOS に git をインストールする"

Welcome to GitHub Copilot in the CLI!
version 0.5.3-beta (2023-11-09)

I'm powered by AI, so surprises and mistakes are possible. Make sure to verify any generated code or suggestions, and share feedback so that we can learn and improve.

Suggestion:

  brew install git
```

残念ながら日本語で返してはくれませんが、シェルコマンドがわからないときに助かります

## GitHub Copilot に AWS CLI の問題を出そう

### AWS S3 のバケット名一覧を取得する

まずは小手調べ

```bash
aws s3 ls | awk '{print $3}'
```

awk を使って名前だけ抜き出しています
完璧な回答です

### AWS S3 から指定バケットの指定プレフィックス配下にあるファイルの合計サイズを取得する

```bash
aws s3 ls --summarize --human-readable --recursive s3://bucket-name/prefix/ | grep 'Total Size:'
```

複雑な要求にも応えてくれますね

### AWS S3 のバージョニングを設定したバケット内でファイルを完全に削除する

```bash
aws s3 rm s3://<bucket-name>/<file-path> --version-id <version-id> --recursive
```

バージョン指定で削除する方法を教えてくれました

### AWS CLI で SQS のキューを作成する

```bash
aws sqs create-queue --queue-name MyQueue
```

### Amazon SQS のキューからメッセージを受信する

これは答えてくれませんでした

### AWS CLI で SQS のキューからメッセージを受信する

```bash
aws sqs receive-message --queue-url <queue-url>
```

こっちだと大丈夫でした

`AWS CLI で` と指定した方が良いようです

### AWS CLI で SQS のキューからメッセージを受信し、破棄する

```bash
aws sqs receive-message --queue-url <queue_url> && aws sqs delete-message --queue-url <queue_url> --receipt-handle <receipt_handle>
```

二つの要求に対して `&&` で繋げて答えてくれました

ただ、これだと受信したメッセージの receipt_handle を使えないため微妙です

流石に難しかったか

### AWS CLI で Lambda 関数の環境変数を取得する

```bash
aws lambda get-function-configuration --function-name FUNCTION_NAME --query 'Environment'
```

見事に `--query` を使っていますね

### AWS CLI で 'prod' を含む Lambda 関数を取得する

```bash
aws lambda list-functions --query "Functions[?contains(FunctionName, 'prod')][]"
```

こちらもお見事ですね

### AWS CLI で DynamoDB のテーブルにデータを格納する

残念、 Dynamo は上手く操作できなさそうです

### AWS CLI で VPC のルートテーブルを取得する

```bash
aws ec2 describe-route-tables --query "RouteTables[?VpcId=='YOUR_VPC_ID']"
```

### AWS CLI で CloudFormation の失敗したイベントを取得する

```bash
aws cloudformation describe-stack-events --stack-name YOUR_STACK_NAME --query "StackEvents[?ResourceStatus=='CREATE_FAILED'].[ResourceStatus, ResourceType, LogicalResourceId]" --output table
```

テーブル形式にしてくれるとは気が利いていらっしゃる

### AWS CLI で API Gateway のAPIキー使用量を取得する

```bash
aws apigateway get-usage --key-id <API_KEY_ID> --start-date <START_DATE> --end-date <END_DATE>
```

惜しい

`--usage-plan-id` の指定が抜けていますね

### AWS CLI で SageMaker のエンドポイントの状態を取得する

```bash
aws sagemaker describe-endpoint --endpoint-name <endpoint_name>
```

## まとめ

実はうまくいかなかった例がもっといっぱいありますが、それなりに答えてくれた、という印象です

awk と組み合わせてくれたり、 query で検索、整形してくれるのが嬉しいですね

当然 AWS CLI 以外のコマンドも色々答えてくれるので、是非活用しましょう