AI経験浅いエンジニアがCodexを試してみた件

有名エンジニアもすなる AI エージェントといふものを、
凡人エンジニアもしてみむとて、するなり。

——という軽い気持ちで、今回 Codex を触ってみました。(紀貫之の土佐日記のパロディです

どうもこんにちは、凡人エンジニアです。

数年前からAIブームがすごいですね。私もchatGPTやGeminiにコーディングを手伝ってもらったり
cursorのチャットとか、コード補完は使っているのですが、1から自然言語でコード作ってくれるっていうAIエージェントが流行ってきてることを耳にしていましたが、全然触れていませんでした。

そんな時、会社が全社員にChatGPTの有償アカウントを配布してくれたので、これを機会にCodexを試してみよう!というのが今回の記事のはじまりです。

初めましてCodex

ということで早速ChatGPTの左メニューからCodexを選択してみました。

そうしたら、このような画面に遷移しました。
このままWebブラウザでもできそうでしたが、自分のIDEで試すが目に入りました。

IDEならローカルにフォルダとかファイルとかいい感じにできるのかな?と思いつきでIDE(vscode)でやることにしました。

ということで、早速vscodeのcodex拡張機能をインストール。。。こんにちは!初めましてCodex!

左側の画面が最初に出て、Sign in with ChatGPTで自分のアカウントでサインイン。
プロンプトが入力できる状態になりました。

何を作ろうか🤔。。。マイクロサービスっぽい何かを作ってみよう!

ということで、以下のようなマイクロサービスっぽい何かを作ることにしました。

  1. Dockerコンテナ上動作するアプリを作成する
  2. アプリはGo言語で作成する
  3. 合わせてテストコードも作成する
  4. テスト環境をDockerコンテナで作成する
  5. アプリの仕様
    • httpでデータを入力
    • kafkaにデータを出力
  6. テストではkafkaからデータが取得できることを確認する

こんな感じの仕様を考えてchatGPTと相談しながらCodexに入力するプロンプトを生成しました。

プロンプト

Go 言語+Kakfa+Docker Compose を使ったマイクロサービス一式を生成してください。

【要件】
- ingest-service という1つのマイクロサービスを作る
- REST API: POST /ingest
- JSON を受け取り Kafka に送信する
- Kafka topic: ingest-events
- メッセージ形式は受け取った JSON をそのまま JSON として publish する
- Kafka との接続には Sarama を使用する

【プロジェクト構造】
/ingest-service
/cmd/server/main.go
/internal/handler/ingest.go
/internal/kafka/producer.go
Dockerfile

docker-compose.yml(以下を含む)
- zookeeper
- kafka
- ingest-service

【テスト要件】
- Go の integration test を作る
- API を叩いてデータを送る
- Kafka コンシューマを使って ingest-events から1件メッセージを取得して内容を確認する
- 期待値と一致する場合 PASS とする

【その他】
- シンプルで実務でありそうな構成にする
- コメントを適度につける
- ビルド・実行方法も README にまとめる

このプロンプトをCodexに与えてみました。その結果、以下のようにファイルが生成されました。

いい感じですね。それっぽいものができたかな。。。?

ダメだ!腐ってやがる!、、、修正もやってくれる?

出来上がったREADMEに従ってdocker composeを動かしました。

がしかし!動かない😢

 => ERROR [builder 4/6] RUN go mod download                                                                                                                                                                                                        0.2s
------
 > [builder 4/6] RUN go mod download:
0.161 go: go.mod requires go >= 1.24.4 (running go 1.21.13; GOTOOLCHAIN=local)
------
Dockerfile:6
--------------------
   4 |     
   5 |     COPY go.mod go.sum ./
   6 | >>> RUN go mod download
   7 |     
   8 |     COPY ingest-service ./ingest-service
--------------------
failed to solve: process "/bin/sh -c go mod download" did not complete successfully: exit code: 1

原因究明のためにDockerfileを確認します。

FROM golang:1.21 AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY ingest-service ./ingest-service

RUN CGO_ENABLED=0 GOOS=linux GOARCH=$(go env GOARCH) \
    go build -o /ingest-service ./ingest-service/cmd/server

FROM gcr.io/distroless/base-debian12

WORKDIR /app
COPY --from=builder /ingest-service /app/ingest-service

ENV PORT=8080
EXPOSE 8080

ENTRYPOINT ["/app/ingest-service"]

ローカル環境がgo.1.24.4なのに、DockerfileでGo.1.21系を使ってやがった!どないやねん!

と思いつつ、サクッと直して再実行。。。

やっぱり動かない😭

こんどはbuildは動きましたが、コンテナが何も動いてない。
原因を調べるためにdocker-compose.yamlを確認します。

version: "3.9"

services:
  zookeeper:
    image: bitnami/zookeeper:3.9
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
    ports:
      - "2181:2181"

  kafka:
    image: bitnami/kafka:3.6
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9093
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
      - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
      - ALLOW_PLAINTEXT_LISTENER=yes

  ingest-service:
    build:
      context: .
      dockerfile: ingest-service/Dockerfile
    environment:
      - PORT=8080
      - KAFKA_BROKERS=kafka:9092
      - KAFKA_TOPIC=ingest-events
    depends_on:
      - kafka
    ports:
      - "8080:8080"

kafkaのイメージがbitnamiを使おうとしてました。bitnamiは2025年現在無償版はほとんど終了してました。。。

なので以下のプロンプトでConfluent/kafkaにしてもらいましょう。

bitnami/kafkaは無料公開ではなくなったのでConfluent Platformに修正してください

やっぱり動かない😭

私のローカル環境がMacbookPro(M4pro)だったのですが、Confluent/kafkaは動作保証されてないからダメみたいでした。
chatGPTに代替案を考えてもらうと、RedPandaを使えばよいとおすすめされました。

サクサクっとredpandaにしてもらうためにCodexに指示しました。

M4 proのmacbookproではkafkaが動かないようなのでRedpandaを使う形で直してください。

出来上がったdocker-compose.yamlは以下の通りです。

version: "3.9"

services:
  redpanda:
    image: docker.redpanda.com/redpandadata/redpanda:v23.3.12
    command:
      - redpanda
      - start
      - --overprovisioned
      - --smp=1
      - --memory=1G
      - --reserve-memory=0M
      - --node-id=0
      - --check=false
      - --kafka-addr=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093
      - --advertise-kafka-addr=PLAINTEXT://redpanda:9092,PLAINTEXT_HOST://localhost:9093
      - --rpc-addr=0.0.0.0:33145
      - --advertise-rpc-addr=redpanda:33145
    ports:
      - "9092:9092"
      - "9093:9093"
      - "9644:9644" # admin API

  ingest-service:
    build:
      context: .
      dockerfile: ingest-service/Dockerfile
    environment:
      - PORT=8080
      - KAFKA_BROKERS=redpanda:9092
      - KAFKA_TOPIC=ingest-events
    depends_on:
      - redpanda
    ports:
      - "8080:8080"

さて、これで動作させてみます。。。!

kafkaは動いた!

次は動作確認!

ということでテスト実行です。READMEにテストコマンドも書いてくれてるので、そのまま実行しました。

http-kafka-sample % go test -v  -tags=integration ./ingest-service
=== RUN   TestIngestEndpointPublishesToKafka
--- PASS: TestIngestEndpointPublishesToKafka (0.13s)
PASS
ok     /test_works/http-kafka-sample/ingest-service   0.309s

とりあえずテストも動いたので、自分でもメッセージをPOSTしてredpandaにデータが入ってるか確認したいと思います。

まずは、redpadaのコンテナに入ってtopicを購読します。

http-kafka-sample % docker exec -it http-kafka-sample-redpanda-1 bash
redpanda@48338861a7f1:/$ rpk topic list            
NAME           PARTITIONS  REPLICAS
ingest-events  1           1
redpanda@48338861a7f1:/$ rpk topic consume ingest-events

これで、redpandaにデータが到着したらこのターミナルに表示されるはず。

curlでアプリにデータをPOSTしてみる

http-kafka-sample % curl -X POST http://localhost:8080/ingest \
     -H 'Content-Type: application/json' \
     -d '{"id":"demo-1","payload":"example"}'

redpandaのターミナルには、、、

redpanda@48338861a7f1:/$ rpk topic consume ingest-events
{
  "topic": "ingest-events",
  "value": "{\"id\":\"demo-1\",\"payload\":\"example\"}",
  "timestamp": 1764643905838,
  "partition": 0,
  "offset": 7
}

無事に表示されました🙌

初めてのCodexの感想

最初のプロンプトから生成された構成は、こちらで指示したとはいえ、中身も含めてちゃんとできていたことにまず驚かされました。

優れたプロンプトを打ち込めば、ちゃんとしたコードを返してくれる。そんな気がします。

そしてプロンプトは、ChatGPTなどの生成AIと相談することでブラッシュアップができるので、仕様を考える力、その仕様で問題ないか判断する力、セキュリティなどが考慮できてるかなど、動作以外の判断する力が重要かと思いました。

がしかし、今回色々ハマったポイントがあるように、生成物はまだすぐに動作できない場合があるのだなと感じました。人間の介在する必要性はまだあるようです。

とはいえ、Codexを使えばすぐに大枠が作れてしまうので、これに肉付けしていく感じで高機能化させることも容易なのではと思いました。人の手で作る大枠をAIで作って必要な部分は人間が手を動かす、またはAIに追加で要望して作成させることで効率よく開発ができそうです。AIに全て任せて書き換えさせると、コード管理がうまくできてないと意図しない更新をされて困ったりすることもあるかもしれないので、そこも注意かなと思いました。

今後、他のAIエージェントや新たな機能も試してみたいと思うので、その際は、また記事にしたいと思います。

新規CTA