【どうなるエンジニア】使ったことないツールなのでChatGPTと対話しながらAWS Lambda (Python3) のコードを書いてもらった話

※掲載内容は執筆者自身の見解であり、必ずしも所属する企業や組織の立場、戦略、意見を代表するものではありません。 

こんにちは、産経デジタル マーケティング部の成田です。
「エンジニアとして仕事してるけど、まったく触ったことがない言語やシステムを使用してコードを書かなくてはいけない状況」の備忘録としてお読みいただけましたら幸いです。

先日上司から「とある組織からデータを入手してweb上に表示したい。成田くんもこのプロジェクトに参加して欲しい。例によって、君、もしくは君のメンバーが捕えられ、あるいは殺されても、当局は一切関知しないからそのつもりで。成功を祈る。なお、このメッセージは5秒後に自動的に消滅する」と言われ、テープは爆発し先方のapiを起動してjsonデータを取得するプログラムを作ることになりました。
※プロジェクトの難易度を表すための比喩表現であり、実際には当局は関知するし、メッセージは消滅も爆発もしていません。

僕は普段はPHP(PHP:Hypertext Preprocessor)を書いていますが、AWS Lambdaは使ったことないですしPythonも触ったことない。困った。という状況になりました。もちろん先輩には「わからなかったらなんでも聞いてね」と言われてますが、ひとまず自分で調べながら作業してみることにしました。

AWS Lambdaとは
Amazon Web Services (AWS)が提供するサーバーレスコンピューティングサービスで、プログラムの実行をトリガーするイベントに基づいて動作する。 サーバーのプロビジョニングや管理を気にすることなくアプリケーションをビルドおよび実行できる。開発者はインフラストラクチャの管理から解放され、コードの記述に集中することができる。

YouTubeや、Amazon Kindle UnlimitedでLambdaについて資料をみたのですが、自分的にあまりしっくりこないまま時間だけが過ぎていきました。(Kindle Unlimitedはかなり書籍が充実していました)が、そういえば最近ChatGPTでプログラムが書けるって話題になっていることを思い出しました。

ChatGPTとは
自然言語処理の進歩を背景に開発された大規模なAI言語モデル。 「Generative Pretrained Transformer」の略で、大量のテキストデータ(インターネット上の文章など)から学習を行い、与えられたプロンプトに対して自然な人間のようなテキストを生成することが可能。

関連記事はこちら▼
ChatGPT

用語の説明

そもそも何をいっているのかわからない…ので用語を薄く調べることからはじめました。

AWS(Amazon Web Services)

Amazonが提供するクラウドコンピューティングサービスの総称。ストレージ、データベース、機械学習、分析など、多様なサービスを提供。

AWS Lambda

AWSが提供するサーバーレスコンピューティングサービス。開発者はコードの実行に専念し、インフラストラクチャの管理はAWSが行う。

サーバーレス

サーバーの設定や管理を気にせずにアプリケーションを実行できる概念。開発者はコードの実行に集中でき、インフラストラクチャの詳細はクラウドプロバイダーが管理。

Python

読みやすさと利便性に重点を置いた高レベルのプログラミング言語。特に科学計算やデータ分析、ウェブ開発、自動化など、様々な用途に使用される。

ChatGPT

OpenAIが開発したAI言語モデル。大量のテキストデータから学習し、人間らしい自然なテキストを生成することができます。

HTTPリクエスト

インターネット上で情報を送受信する主要な方法。一般的な種類にはGET(データの取得)、POST(データの送信)、PUT(データの更新)、DELETE(データの削除)がある。

ふむ… すこしわかった気持ちになってきた…

AWS Lambdaでhello, world

なんとなく、薄い知識がついたので次はhello, worldしてみます。hello, worldはいつやっても楽しいですね。ツールを初めて動かすこの感じ。とてもわくわくします。
※ AWS環境は事前に用意されていることを前提とします。

AWSにログインしたら、「サービス」の「すべてのサービス」から「Lambda」を選択。

「関数の作成」をクリック。

「一から作成」を選択(デフォルトで選択されています)

続いて「関数名」をなんでもいいので入力します。

「ランタイム」を「Python 3.10」(ここはバージョンによって変わります)

以下、「アーキテクチャ」などは触らずに右下の「関数の作成」をクリック。

そうすると、関数が作成され

import json

def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}

というコードを確認できるかと思います。

そうしたらここはそのままに、すぐ上にある「テスト」ボタンをクリック。

テストイベントを設定するモーダルが開くので、「イベント名」に適当な名前を入力して、「保存」をクリック。

設定できたら、もう一度「テスト」ボタンをクリック。

そうすると

Test Event Name
test_test
Response
{
"statusCode": 200,
"body": "\\"Hello from Lambda!\\""
}

というのが確認できるかと思います。

これでhello, worldは成功です。

実用的なコードを書く

hello, worldはできたけど、このあと何をすればいいのかわからない。

現在の学習状態でググると、専門的すぎて何言ってるかわからない記事か、hello, worldの記事しかこの世に存在しないのではと思うほど、求めている記事がみつかりにくいです。

そんなとき、役に立つのがChatGPT。 すこーしわかってるけど、でも何をどうしたらいいかわからない時に、解決の糸口を授けてくれます。

今回は、外部からjsonを取得するコードを書いていきたいと思います。

jsonの取得先はjsonplaceholderさんを使わせていただきます。

https://jsonplaceholder.typicode.com/ (こちらはLambdaからだと403になってしまうので適宜ご用意いただければと思います)

では実際にChatGPTにコードを書いてもらいましょう。

以下の文言を入力して対話します。

AWS Lambda(Python3.10)を使用して、 “https://xxxxxxxxxxxxxxxxxxxxxxxxxxx” からjsonを取得するコードを書いてください。

すると以下の文とコードが返ってきます。

AWS Lambdaを使用して、指定されたURLからJSONデータを取得するためのPythonコードは以下の通りです。このコードはPythonの**requests**ライブラリを使用しています。なお、AWS Lambdaにデプロイする際には、必要な依存関係を含めることを忘れないでください。

import json
import requests
import boto3

def lambda_handler(event, context):
url = '<https://xxxxxxxxxxxxxxxxxxxxxxxxxxx>'
response = requests.get(url)
if response.status_code == 200:
    data = response.json()
    print(data)
    return {
        'statusCode': 200,
        'body': json.dumps(data)
    }
else:
    print(f"Failed to get data from {url}. Status code: {response.status_code}")
    return {
        'statusCode': response.status_code,
        'body': 'Failed to get data.'
    }

このコードは、指定されたURLからGETリクエストを送信し、結果を取得します。取得したデータはJSON形式でパースされ、結果を出力として返します。このコードは、AWS Lambdaのハンドラ関数として動作します。

なお、PythonのrequestsライブラリはAWS Lambdaの環境にはデフォルトでは含まれていないため、このコードをデプロイする際にはrequestsを含める必要があります。PythonのパッケージをAWS Lambdaにデプロイする方法については、AWSの公式ドキュメンテーションを参照してください。

ありがとうChatGPT… 実際に動かしてみましょう。 ソースコードをコピーし、既存のコードを全選択したらコピーしたコードを貼り付けてください。その後、Deployボタンをクリックしてテストボタンをクリック。

すると… エラーがでますね。何をいっているかわからないので、Response部分をそのままChatGPTに貼り付けましょう。

※jsonの取得先のURLが正しく設定されていないと下記のエラーとは違うエラーになります。

Response
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'requests'",
"errorType": "Runtime.ImportModuleError",
"requestId": "8e07249b-242e-49d3-b153-fc3e86f6b9f6",
"stackTrace": []
}

すると、requestsは標準ライブラリではないので…というメッセージの後にrequestsを動かす手順が書かれていると思います。これを実行してもいいのですが、今回は標準ライブラリをつかってコードを書いてもらうことにしましょう。

次のメッセージをChatGPTに送信します。

Lmabdaの標準ライブラリだけで済むようにしてください。

すると、

import json
import urllib.request

def lambda_handler(event, context):
    url = "<https://xxxxxxxxxxxxxxxxxxxxxxxxxxx>"
    
    # URLからJSONデータを取得
    with urllib.request.urlopen(url) as response:
        data = json.loads(response.read().decode())
    
    # 取得したJSONデータを表示
    print(data)
    
    # 必要な処理を追加...
    
    return {
        'statusCode': 200,
        'body': json.dumps('JSONデータの取得に成功しました')
    }

というコードが返ってきました。これをLambdaの関数にセットして実行すると… Function Logs という項目の下にjsonが取得できているのを確認できると思います。

この記事ではここでコードの生成を終わります。 実際にこの後した作業としては、

  • 取得したjsonをid毎に分ける
  • Amazon S3のバケットにjsonファイルをアップロードする

などのコードを生成し、無事にプロジェクトを乗り切ることができました。

ChatGPTでコードを書いてもらうときの注意点とコツ

コードを書いてもらう際の、注意点とコツを見ていきましょう。

実用的なコードが1回のやり取りでできるわけではない。

いくらAIに書いてもらったからといって、すぐに完璧なコードができるわけではありません。 (といっても8割くらいはできてますが…) 複雑な問題は、部分に分解してそれぞれ対話を行うことでコードの精度があがります。 あと、関数ごとにコードを書いてもらうことで、コードの可読性もあがります。

検証はしっかり行い、小分けにコードを書いてもらう

これは特に、大事だと思いました。 いくらChatGPTといってもコードは完全ではない。ということは念頭においてください。 それを踏まえて、大きなプログラムを一度に生成よりも、途中結果を確認しながらステップごとにコードを生成することをお勧めします。 そして、今回のように初めて触る言語でも、デバッグを行なっていくことで知識が身についていきます。

まとめ

今回はChatGPTを利用してLambdaにPythonのコードを書いてもらいました。 まったく触れたことのない言語でも、少しの基礎知識で十分実用可能なコードが生成できたかとおもいます。今後エンジニアの仕事としてはAIが生成したコードを調整していく作業にシフトしていくのではないか… などと考えさせられました。 最後までお読みいただき、ありがとうございました!

※掲載内容は執筆者自身の見解であり、必ずしも所属する企業や組織の立場、戦略、意見を代表するものではありません。 

TOP