AWSシークレットマネージャーに、chatgptのapiキーを保存して、lambda経由でチャットする(引数名:test1 -> prompt)
1, AWSシークレットマネージャーに、chatgptのapiキーを保存
2, lambdaを新規作成してコピペ
3, lambdaレイヤー(共通ライブラリ)に、有志公開のARNを追加(requests)
4, 3秒だとタイムアウトするので、1分位にしておく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import json import boto3 import requests def get_secret(): secret_name = "CHATGPT_API_KEY" region_name = "ap-northeast-1" session = boto3.session.Session() client = session.client(service_name='secretsmanager', region_name=region_name) get_secret_value_response = client.get_secret_value(SecretId=secret_name) secret = get_secret_value_response['SecretString'] return json.loads(secret)[secret_name] def lambda_handler(event, context): api_key = get_secret() headers = { "Authorization": f"Bearer {api_key}" } data = { "model": "gpt-3.5-turbo", # 使用するモデルを指定 "messages": [{"role": "user", "content": event['prompt']}], # ユーザーからの入力プロンプトをメッセージとして設定 } response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data) try: # API応答から最初の応答テキストを取得 response_text = response.json()['choices'][0]['message']['content'] except KeyError as e: # KeyErrorが発生した場合のエラーメッセージをログに出力 print(f"KeyError: {e}. Response content: {response.content}") raise return { 'statusCode': 200, 'body': json.dumps(response_text, ensure_ascii=False) } |
5, 新規作成されたラムダのポリシーに、chatgptのapiキーを保存したシークレットマネージャーのarnとGetSecretValueを追加して、APIキーを読めるようにしておく
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents", "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:logs:ap-northeast-1:123456789:log-group:/aws/lambda/chatgpt:*", "arn:aws:secretsmanager:ap-northeast-1:123456789:secret:CHATGPT_API_KEY-xxxxx" ] } |