驚くべき完成度！AWSでサーバレスAPIの作成をChatGPTに頼んだ結果〜AWSエンジニアの役割が変化する?!〜

# はじめに

ChatGPTがリリースされて日々、会話しては衝撃を受けています。
現在AWSエンジニアとして働いていますが、自分たちの働き方も大きく変わるのでは？！と感じて色々ChatGPTの使い方、自分達の働き方を模索しています。

* AWSでのサーバレスAPIの作成をChatGPTに依頼したらどうなるのか？

という事を現時点（2023/3/19のGPT-4)のChatGPTで試しながら、結果を元に自分たちの働き方がどう変わるのか考えてみたいと思います。

## ChatGPTとは

ChatGPTとは、OpenAIが開発した大規模な言語モデルです。
自然言語処理の能力が非常に高く、チャットベースで依頼・質問する事で質問応答、文章生成や翻訳だけでなく、タスクもこなしてくれます。私が一番衝撃を受けたのは、ある程度のコーディングも書いてくれる事です。
もしかして、人間が数時間かけて書くプログラムも一瞬で作成してくれるのでは？　という事で試してみました。

## GPT-3.5との戦い
ChatGPTの人工知能言語モデル「GPT-4」というのが3/14にリリースされました。

ちょうど、リリースされる直前「GPT-3.5」で丸１日ぐらいかけて、SPAのWebアプリをChatGPTに書かせていました。

何度も質問や依頼を繰り返さないと適切なコードを書いてくれなかったり、書かれたコードのエラーや間違いを指摘すると、それまで書いていたコードと整合していないコードが出力されたりと半日ぐらいやりとりしました。

依頼のプロンプトを色々試行錯誤したり、一度にすべての生成は難しいと判断しバックエンドのフロントエンドに分けて依頼したりしましたが、結果実装までは至りませんでした。

## GPT-4のリリース

そんな中、「GPT-4」がリリースされたのでこちらのモデルでバックエンドAPIの実装をどこまでやってくれるのか試してみました。
※現時点でGPT-4が利用できるのは有料版のみとなります。

## 今回作成したい構成と環境とルール

### 今回の構成

![chatGPT-arc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918922/d0166a22-c0f7-0674-b589-46a449ec7c7e.png)

リモートワークで誰がどこにいるのか分からない・・・を解消するために出勤したら、自分の働いている場所を記録するアプリケーションを想定しています。このアプリケーションのバックエンドをAPI　GatewayーLambdaーDynamoDBで実装する事を想定し、依頼していきます。

開発環境としてCloud9を利用し、生成されたコードをCloud9を使って実装していきます。

### ルール

今回のAPI実装には以下のルールで実装を行いました。

* 基本的にChatGPTで生成されたコードもしくはコマンドをコピペ
* ChatGPTから、指示があった部分以外はコードは修正しない
* エラーが発生した場合は、出力されたエラーをそのままChatGPTに聞く
* Cloud9環境から実装するが、Cloud9はノンカスタマイズ環境

記事の構成上ChatGPTの会話と私の質問を分かりやすくする為、以下スタイルで書きます。

:::note 
ChatGPTとのやりとりで書いたプロンプトはこのスタイルで書きます。
:::

# ChatGPTに依頼した結果

## プロンプト
こちらのプロンプトで依頼しました。

:::note 
AWS以下構成でAPIを実装したいです。
IaCとプログラムのコードを教えてください。

API
　UserNameとUserLocationをパラメータとして受け取る

Lambda
　put_Function
　　APIからリクエストを受け取りDynamoDBに書き込む
　Get_Function
　　APIからリクエストを受け取りDynamoDBのすべてのデータを返却

DynamoDB
　プライマリーキー：UserName
　パーティションキー　：UserLocation
:::

# ChatGPTの回答

以下に、AWS CDKを使ったIaCとLambdaのコードを示します。まずは、Pythonを使用してAWS CDKをセットアップする必要があります。このリンクに従ってAWS CDKをインストールしてください: https://docs.aws.amazon.com/cdk/latest/guide/work-with-cdk-python.html

### IaC (AWS CDK)
ファイル名: cdk_app.py
```Python:cdk_app.py
from aws_cdk import (
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    aws_dynamodb as ddb,
    core
)

class ApiStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # DynamoDB Table
        user_table = ddb.Table(
            self, "UserTable",
            partition_key=ddb.Attribute(name="UserName", type=ddb.AttributeType.STRING),
            sort_key=ddb.Attribute(name="UserLocation", type=ddb.AttributeType.STRING),
            billing_mode=ddb.BillingMode.PAY_PER_REQUEST,
            removal_policy=core.RemovalPolicy.DESTROY
        )

        # Lambda Functions
        put_function = _lambda.Function(
            self, "PutFunction",
            runtime=_lambda.Runtime.PYTHON_3_9,
            handler="put_function.lambda_handler",
            code=_lambda.Code.from_asset("lambda"),
            environment={
                "USER_TABLE": user_table.table_name
            }
        )

        get_function = _lambda.Function(
            self, "GetFunction",
            runtime=_lambda.Runtime.PYTHON_3_9,
            handler="get_function.lambda_handler",
            code=_lambda.Code.from_asset("lambda"),
            environment={
                "USER_TABLE": user_table.table_name
            }
        )

        # Grant permissions to Lambda functions
        user_table.grant_read_write_data(put_function)
        user_table.grant_read_write_data(get_function)

        # API Gateway
        api = apigw.RestApi(self, "UserApi")

        user_resource = api.root.add_resource("user")
        user_resource.add_method("POST", apigw.LambdaIntegration(put_function))
        user_resource.add_method("GET", apigw.LambdaIntegration(get_function))

app = core.App()
ApiStack(app, "ApiStack")
app.synth()
```

### Lambda Functions

lambdaディレクトリ内に以下の2つのファイルを作成します。

ファイル名: put_function.py

```Python:put_function.py
import json
import boto3
import os

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(os.environ["USER_TABLE"])

def lambda_handler(event, context):
    body = json.loads(event["body"])
    user_name = body["UserName"]
    user_location = body["UserLocation"]

    table.put_item(
        Item={
            "UserName": user_name,
            "UserLocation": user_location
        }
    )

    return {
        "statusCode": 200,
        "body": json.dumps({"message": "User data saved."})
    }

```

ファイル名: get_function.py

```Python:get_function.py
import json
import boto3
import os

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(os.environ["USER_TABLE"])

def lambda_handler(event, context):
    response = table.scan()
    items = response["Items"]

    return {
        "statusCode": 200,
        "body": json.dumps({"users": items})
    }

```
この

:::note 
続きをお願い
:::

この構成をデプロイするには、以下の手順に従ってください。

必要なパッケージをインストールします。
requirements.txtファイルを作成し、以下の内容を追加します。

```ｔｘｔ:requirements.txt
aws-cdk.core
aws-cdk.aws_lambda
aws-cdk.aws_apigateway
aws-cdk.aws_dynamodb
```
ターミナルで、以下のコマンドを実行してパッケージをインストールします。

```
pip install -r requirements.txt
```

プロジェクト構造を確認します。
プロジェクトディレクトリは、次のような構造になります。

```
.
├── cdk_app.py
├── requirements.txt
└── lambda
    ├── put_function.py
    └── get_function.py
```

AWS CDKを使ってスタックをデプロイします。
まず、ターミナルで以下のコマンドを実行して、CDKアプリを初期化します。

```
$ cdk init
```
次に、以下のコマンドを実行して、スタックをデプロイします。

```
$ cdk deploy
```
デプロイが完了すると、API Gatewayのエンドポイントが表示されます。このエンドポイントを使って、APIにアクセスできます。

APIをテストします。
POSTメソッドを使って、新しいユーザーを追加します。
```
$ curl -X POST -H "Content-Type: application/json" -d '{"UserName": "John", "UserLocation": "New York"}' https://your-api-endpoint.amazonaws.com/user
```
GETメソッドを使って、すべてのユーザーを取得します。
```
$ curl -X GET https://your-api-endpoint.amazonaws.com/user
```
:::note 
--app is required either in command-line, in cdk.json or in ~/.cdk.json というエラーが発生しました
:::

すみません、初期化手順に不足がありました。以下の手順で問題を解決できます。

cdk.jsonファイルをプロジェクトのルートディレクトリに作成し、以下の内容を追加してください。
```json:cdk.json
{
  "app": "python3 cdk_app.py",
  "context": {
    "@aws-cdk/core:enableStackNameDuplicates": "true",
    "aws-cdk:enableDiffNoFail": "true",
    "@aws-cdk/core:stackRelativeExports": "true"
  }
}
```
ターミナルで、以下のコマンドを実行して、スタックをデプロイします。
```
$ cdk bootstrap
$ cdk deploy
```
これで、エラーが解消されるはずです。デプロイが完了したら、API Gatewayのエンドポイントが表示されます。そのエンドポイントを使ってAPIにアクセスできます。

## ChatGPT
画像が荒いのですが、ここまでのやりとりの雰囲気を載せておきます。（気が向けば動画に差し替えます）
![chatGPT4-API.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918922/6e96ac14-47fc-4b9d-5c10-7de48589a6d5.gif)

## 実装の結果

GPT3.5と半日やりとりして、結果できなかった事が初手の回答からかなりの精度回答される事にかなりの衝撃を受けました。

一つ初期化手順が無く、エラーが発生しましたが、エラーについて質問するとすぐに原因と対処を教えてくれて、解決し実装できました。
単純にコードを書くだけで無く、フォルダ構成やファイル名も明確に回答したうえで、IaCはCDKを使って実装するとは・・・
さらには、聞いていないにも関わらずAPIの動作確認のコマンドまで準備してくれるとは・・・
（実際このコマンドで動作確認でき、DynamoDBにレコードが追加される事と取得できることは確認できました。）

# 今後のAWSエンジニアの役割とは

現時点でもこれだけの事をやってくれました。
AIも日々進化しているので、今後何かを実装したり、作ったり、依頼されたタスクをこなしたりというのは、AIを使ってかなり効率化されたり、ほぼAIがやってくれるのでは？というのを身をもって感じました。

日々、今の自分の仕事はAIでもできるのか？　というのを問い続けながら、スキルアップしてきたいです。
今の所、こんな役割は残るんじゃないかと思っています。

* AIの生成されたものをレビューできるだけのスキル
* ビジネスや仕組みを考える事、生み出す力
* AIにどううまく仕事を頼むか
* 人との関わりやチームのビルディング

ここ１、２年でコロナ流行により、エンジニアの働き方は、オフィスでのワークからリモートワークに世の中が振り切れてました。
ChatGPTの出現により、今後数年でエンジニアの働き方だけでなく、役割がまた大きく変わるのでは無いでしょうか。

Slack、Teams、ドキュメントベースで依頼できる様な仕事（リモートでベースでやりやすい仕事）は、今後ほぼAIでできる様になるのではないかと思っています。
ここ最近GAFAMなどの米テック企業を中心に出社回帰やリストラが進みましたが、その辺りを見越しての動きかと勘繰ってしまいます。

[田端信太郎氏「1流は脱リモートワーク。1.5流は社員の顔色を伺っている」Amazonなど米テック企業に“出社回帰”の動き](https://times.abema.tv/articles/-/10069375)

https://times.abema.tv/articles/-/10069375


# さらにこの記事のタイトルも・・・

## 記事タイトルの案も聞いてみました
このQiitaの記事のタイトルについても聞いてみました。
回答の結果をかなり参考にタイトルつけました。

### プロンプト
:::note 
ChatGPTにAWSのサーバレスAPIの作成を依頼したら、作成してくれました。
この内容を記事にしたいのですが、いい感じのタイトルお願いします。
・ほぼ完成形を作ってくれてビックリしたこと
・AWSエンジニアの仕事が効率化もしくは無くなるかもしれないこと
ということを伝えたいです。
:::

### ChatGPT回答
*以下は、ご要望に基づくタイトルの例です。*

*「驚くべき完成度！AWSサーバレスAPIをChatGPTが作成してくれた」*
*「AWSエンジニアの仕事に変革が訪れる？ChatGPTによるサーバレスAPIの作成」*
*「ChatGPTによるAWSサーバレスAPIの自動生成によって、エンジニア業務が変わる？」*
*「ChatGPTによってAWSサーバレスAPIが自動生成される時代へ」*
*「AIによるAWSサーバレスAPIの自動生成によって、エンジニアの役割が変化する？」*

## 続編
2023/4/9 追記
今回の記事の続編として、週刊AWSをGPTを使って再現してみました。

https://qiita.com/takuma818t/items/88b0005dd5cfcc55b42a

2023/9/30 追記

Amazon Bedrockがリリースされたので、本記事と同じ内容を依頼してみました。
https://qiita.com/takuma818t/items/fad92be5edfdf39f17f4


## 最後に

ここまで読んで頂いてありがとうございます。これを読んで頂いているあなたにとって一つでも参考になる情報があれば幸いです。

もし参考になったら「いいね」やストックしてもらえたら励みになりますのでよろしくお願いします。