GitHub Copilotで実際に業務で使用してみた。

# GitHub Copilotで実際に業務で使用して見ました。

## 前提事項

* GitHub Copilot トライアル 60日無料を登録しました。
* VSCodeで使用しました。プラグインも入れました。
* AWS CDK typescriptでLambdaを使用するコードを記述しました。
* ChatGPTも使用しました。プラグインも入れました。
* 今回いろいろな検証のためで、初めて使います。

## 実装してみた

### aws lambdaの作成

``` aws lambdaをデプロイするCDKをtypescriptで作成 ``` 
とChatGPTに聞いてみたら、それらしいコードが出てきた。
それなりに書けています。

```
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';

export class MyStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new lambda.Function(this, 'MyLambdaFunction', {
      runtime: lambda.Runtime.NODEJS_14_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda'),
    });
  }
}

const app = new cdk.App();
new MyStack(app, 'MyStack');

```

なので、色々と名前やパラメータを修正しました。

typescriptのimportも
```// import cdk lambda ```
と入力すると、Copilotが
```
import * as lambda from 'aws-cdk-lib/aws-lambda';
```
サジェストしてくれます。
今までは、コードアシストで、エラー解決からimport書いてくれるが、importのレベルが違ったり、色々選ぶ必要があったりで修正など必要でしたが、一発でかけます。素晴らしい。

また、サジェストは文字列まで提案してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/e8eea31a-7c80-6fdd-23da-3d0b61b3946b.png)
いままでは型にあったサジェストでしたが、記述する値や内容も提案してくれます。
他に記述したコードと同じように記述できるように提案してくれるような気がします。
そのため、書き方の共通化ができると思います。


### layerの作成

lambdaと同じようにlayerも作成できました。

### lambdaを呼び出すイベントの追記

S3に何かファイルが登録されるとlambdaを呼び出したいのでそのコードを追記します。
例によって、
``` create cdk lambda typescript and add event S3 bucket ```
と聞いてみます。

```
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as lambda from '@aws-cdk/aws-lambda';
import * as path from 'path';

export class MyCdkLambdaProjectStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Create a new S3 bucket
    const bucket = new s3.Bucket(this, 'MyBucket');

    // Define a Lambda function that will be triggered by the S3 bucket event
    const handler = new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.NODEJS_12_X,
      handler: 'handler.handler',
      code: lambda.Code.fromAsset(path.join(__dirname, '../lambda')),
    });

    // Grant read permissions on the bucket to the Lambda function
    bucket.grantRead(handler);
    
    // Add an S3 bucket event trigger to invoke the Lambda function
    handler.addEventSource(new lambda.EventSourceMapping(this, 'MyEventSourceMapping', {
      eventSourceArn: bucket.bucketArn,
      startingPosition: lambda.StartingPosition.LATEST,
    }));
  }
}
```
と提案されましたので、追記していきました。

しかしここで問題が、
サンプルコードでは、
``` 
    // Create a new S3 bucket
    const bucket = new s3.Bucket(this, 'MyBucket');
```
となっているが、S3は既存の作成済みのS3を指定したい。
そのため、
```
// get bucket form id
```
として、
```
const bucket = s3.Bucket.fromBucketName(this, appName + '-bucket', context.bucket);
```
と提案されたので、そのように修正したところ、BucketクラスとIBucketクラスで型が合わず、コンパイルエラーで赤くなる。
いろいろ聞いてみましたが、それ以上のことはGitHub Copilot、ChatGPTでは分からず、、、、残念
聞き方が悪いのかもしれませんが、思ったことを返してくれなかったりで。要改善

結局いつものように検索したら
https://github.com/aws/aws-cdk/issues/2004
にS3からイベントを登録すると記述があったので、そのように記述しました。

記述するときは、GitHub Copilotが元のコードにあった記述を提案してくれました。

## 現時点の結果

* 現時点でAIはそれなりに役立ちますが、完璧ではない。
* GitHub CopilotやChatGPTを入れることによって、開発効率は上がる。
* GitHub Copilotの自動補完は今までの構造などからの推測より、かなり使いやすくなっている。
* AIの聞き方は検索キーワードと同じように、テクニックが要る。
* 当然ながら、AIが提案したコードの意味がわからないと、話にならない。
* GitHub Copilotは値段以上の仕事はしてくれそう。
* 今回の使い方ではChatGPTは、bingのchatで代替できそう。
* ChatGPTはもう少し調べる必要あり。