はじめに
Amazon Q Developerはどんなことができるのか検証してみたので、内容をまとめてみます!
この記事は、Japan AWS Jr. Champions Advent Calendar 2025 14日目の記事です![]()
たくさんの Japan AWS Jr. Champions 2025 メンバーが記事を投稿していきますので、ぜひ他の日や他のシリーズで投稿された記事もチェックいただけますと幸いです!
記事のおすすめ読者
- Amazon Q Developerを今すぐ使ってみたい人
- Amazon Q Developerでどんなことができるのか知りたい人
Amazon Q Developerとは
Amazon Q Developer は、生成人工知能 (AI) を活用した会話アシスタントであり、 AWS アプリケーションの理解、構築、拡張、運用に役立ちます。 AWS アーキテクチャ、 AWS リソース、ベストプラクティス、ドキュメント、サポートなどについて質問できます。
Amazon Q Developer は、生成人工知能 (AI) を活用した会話アシスタントで、
チャットベースでAWSに関することや、コード等色々質問でき、
開発支援をしてくれるサービスです。
今回検証する内容
1. Amazon Q DeveloperにPythonコードを書かせてみる
2. 既存リソースのCloudFormationテンプレートを作成してもらう
前提条件
- AWS CLI導入済み
- VSコードにAmazon Q Developerの拡張機能インストール済
VSコードへの拡張機能インストール方法は別ブログにてまとめていますので、良ければ参考にしてみてください。
① Amazon Q DeveloperにPythonコードを書かせてみる
使用するプロンプト
今回は以下プロンプトを入力し、ローカルに保存されている画像をS3へアップロードするPythonコードを書いてもらえるのか検証してみます。
※CLIの設定、S3バケットの作成は事前に終わっています。
ローカルの保存されている画像をAWS S3にアップロードするPython関数を作成してください。
仕様:
関数名: upload_image_to_s3
パラメータ:
- file_path: image/test-image.jpeg --ローカル画像ファイルのパス
- bucket_name: test-handon-bucket --S3バケット名
- object_key: image/test-image.jpeg --S3での保存先キー
- region: ap-northeast-1 -- AWSリージョン
機能要件:
- 対応画像形式: JPG, PNG
- ファイルサイズ制限チェック(最大10MB)
- Content-Typeの自動設定
- 成功時は成功ステータスとS3 URLを返す
- 失敗時は適切な例外処理を実施
プロンプトで意識した点
プロンプトを書くときに意識した点をメモとして記載しておきます。
- 機能要件はなるべく詳細に書く
- なるべく詳細に記載してあげることで、少ないやり取りで意図に沿ったコードを生成してくれます
- インデント分けて見やすくしておく
- 文章でつらつらとプロンプトを書くより、「パラメータ」、「機能要件」等記載のテーマごとにインデント分けて箇条下記で書いてあげたほうが、指示がいい感じに通ります!
- プロンプトを書いている側も文章でつらつらより言いたいことが整理できてGoodなのでオススメです
いざ、検証!
拡張機能のチャット画面で先ほどのプロンプトを打ち込むと実際にpythonファイルが作成されました!

生成されたファイルの中身(s3_upload.py)
import boto3
import os
from pathlib import Path
from botocore.exceptions import ClientError
def upload_image_to_s3(file_path, bucket_name, object_key=None, region='ap-northeast-1'):
"""S3に画像をアップロードする"""
# ファイル存在確認
if not os.path.exists(file_path):
raise FileNotFoundError(f"ファイルが見つかりません: {file_path}")
# サイズチェック(10MB)
file_size = os.path.getsize(file_path)
if file_size > 10 * 1024 * 1024:
raise ValueError(f"ファイルサイズ超過: {file_size / (1024*1024):.2f}MB(最大10MB)")
# 形式チェック
ext = Path(file_path).suffix.lower()
if ext not in {'.jpg', '.jpeg', '.png'}:
raise ValueError(f"非対応形式: {ext}(JPG/PNG のみ)")
# Content-Type設定
content_type = 'image/jpeg' if ext in {'.jpg', '.jpeg'} else 'image/png'
# object_keyのデフォルト設定
if object_key is None:
object_key = os.path.basename(file_path)
try:
s3_client = boto3.client('s3', region_name=region)
# バケット作成(存在しない場合)
try:
s3_client.head_bucket(Bucket=bucket_name)
except ClientError:
s3_client.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={'LocationConstraint': region}
)
# アップロード
s3_client.upload_file(
file_path,
bucket_name,
object_key,
ExtraArgs={'ContentType': content_type}
)
s3_url = f"https://{bucket_name}.s3.{region}.amazonaws.com/{object_key}"
return {
'status': 'success',
's3_url': s3_url,
'bucket': bucket_name,
'key': object_key
}
except ClientError as e:
raise Exception(f"S3エラー: {e.response['Error']['Message']}")
if __name__ == '__main__':
script_dir = os.path.dirname(os.path.abspath(__file__))
result = upload_image_to_s3(
file_path=os.path.join(script_dir, 'image', 'test-image.jpg'),
bucket_name='test-handson-bucket',
object_key='image/test-image.jpg',
region='ap-northeast-1'
)
print(f"✓ アップロード成功")
print(f"URL: {result['s3_url']}")
コード見てみるとプロンプトの機能要件に記載した内容がばっちり反映されてそうですね!
機能要件:
- 対応画像形式: JPG, PNG
- ファイルサイズ制限チェック(最大10MB)
- Content-Typeの自動設定
- 成功時は成功ステータスとS3 URLを返す
- 失敗時は適切な例外処理を実施
実際に生成されたコードを動かしてみる
ここからはもっとも重要な検証ですね!
本当に生成されたコードは動くんかいというところです。
pythonファイル実行すると・・・成功のステータスが返ってきました![]()
✓ アップロード成功
URL: https://test-handson-bucket.s3.ap-northeast-1.amazonaws.com/image/test-image.jpg
コンソールでS3見に行ってもちゃんと上がっていますね!検証成功です![]()

② 既存リソースのCloudFormationテンプレートを作成してもらう
以下アーキ図のようなとってもシンプルな2つのサービスのテンプレートを作成できるのか検証してみます。

使用するプロンプト
既存リソースのCloudFormationテンプレートYAMLを作成してください:
Lambdaのソースの情報等リソース情報はCLIで取得してテンプレートに反映させてください。
**リージョン**: ap-northeast-1
**必要なリソース**:
- [リソース1]: Lambda Function
- リソース名:handson-test-lambda
- [リソース2]: APIGateway
- リソース名:handson-test-lambda-API
- ステージ名:dev
- [リソース3]: IAM
- IAMロール名:handson-test-lambda-role --Lambdaに付与するロール
- IAMポリシー名:AWSLambdaBasicExecutionRole-handson
パラメータ、出力、タグも含めて包括的なテンプレートを生成してください。
プロンプトで意識した点
- 既存リソースのIaC化のため、CLIでリソース情報を見に行ってもらうことでプロンプトを省略
- テンプレート書いてもらうにはリソース情報が必要だと思いますが、つらつら書くのがめんどくさかったのでCLIで実行してもらうようにしました
- CLIで見に行ってねとプロンプトに書かなかったら勝手に新規ソースを考え始めてしまったので、明言化しておくことでCLI実行して色々情報引っ張ってくれました
いざ、検証!
プロンプトを打ち込むとテンプレートファイルの生成とCLF実行コマンドを教えてくれました。

生成されたテンプレートファイル
AWSTemplateFormatVersion: '2010-09-09'
Description: 'CloudFormation template for existing Lambda, API Gateway, and IAM resources'
Parameters:
Environment:
Type: String
Default: dev
Description: Environment name
ProjectName:
Type: String
Default: handson-image-upload
Description: Project name
Resources:
# IAM Policy
LambdaExecutionPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: AWSLambdaBasicExecutionRole-handson
Path: /service-role/
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: logs:CreateLogGroup
Resource: !Sub 'arn:aws:logs:${AWS::Region}:${AWS::AccountId}:*'
- Effect: Allow
Action:
- logs:CreateLogStream
- logs:PutLogEvents
Resource: !Sub 'arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/handson-test-lambda:*'
# IAM Role
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
RoleName: handson-test-lambda-role
Path: /service-role/
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- !Ref LambdaExecutionPolicy
Tags:
- Key: Name
Value: handson-test-lambda-role
- Key: Project
Value: !Ref ProjectName
- Key: Environment
Value: !Ref Environment
# Lambda Function
HandsonLambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: handson-test-lambda
Runtime: python3.12
Handler: lambda_function.lambda_handler
Role: !GetAtt LambdaExecutionRole.Arn
Timeout: 3
MemorySize: 128
Architectures:
- x86_64
Code:
ZipFile: |
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Tags:
- Key: Name
Value: handson-test-lambda
- Key: Project
Value: !Ref ProjectName
- Key: Environment
Value: !Ref Environment
# API Gateway REST API
HandsonApiGateway:
Type: AWS::ApiGateway::RestApi
Properties:
Name: handson-test-lambda-API
Description: Created by AWS Lambda
EndpointConfiguration:
Types:
- REGIONAL
Tags:
- Key: Name
Value: handson-test-lambda-API
- Key: Project
Value: !Ref ProjectName
- Key: Environment
Value: !Ref Environment
# API Gateway Resource
ApiResource:
Type: AWS::ApiGateway::Resource
Properties:
RestApiId: !Ref HandsonApiGateway
ParentId: !GetAtt HandsonApiGateway.RootResourceId
PathPart: handson-test-lambda
# API Gateway Method
ApiMethod:
Type: AWS::ApiGateway::Method
Properties:
RestApiId: !Ref HandsonApiGateway
ResourceId: !Ref ApiResource
HttpMethod: POST
AuthorizationType: NONE
Integration:
Type: AWS_PROXY
IntegrationHttpMethod: POST
Uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HandsonLambdaFunction.Arn}/invocations'
# Lambda Permission for API Gateway
LambdaApiPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref HandsonLambdaFunction
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
SourceArn: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${HandsonApiGateway}/*/*/*'
# API Gateway Deployment
ApiDeployment:
Type: AWS::ApiGateway::Deployment
DependsOn: ApiMethod
Properties:
RestApiId: !Ref HandsonApiGateway
# API Gateway Stage
ApiStage:
Type: AWS::ApiGateway::Stage
Properties:
RestApiId: !Ref HandsonApiGateway
DeploymentId: !Ref ApiDeployment
StageName: dev
Tags:
- Key: Name
Value: handson-api-dev
- Key: Project
Value: !Ref ProjectName
- Key: Environment
Value: !Ref Environment
Outputs:
LambdaFunctionArn:
Description: Lambda Function ARN
Value: !GetAtt HandsonLambdaFunction.Arn
Export:
Name: !Sub '${AWS::StackName}-LambdaArn'
LambdaFunctionName:
Description: Lambda Function Name
Value: !Ref HandsonLambdaFunction
Export:
Name: !Sub '${AWS::StackName}-LambdaName'
ApiGatewayUrl:
Description: API Gateway endpoint URL
Value: !Sub 'https://${HandsonApiGateway}.execute-api.${AWS::Region}.amazonaws.com/dev/handson-test-lambda'
Export:
Name: !Sub '${AWS::StackName}-ApiUrl'
ApiGatewayId:
Description: API Gateway ID
Value: !Ref HandsonApiGateway
Export:
Name: !Sub '${AWS::StackName}-ApiId'
LambdaRoleArn:
Description: Lambda Execution Role ARN
Value: !GetAtt LambdaExecutionRole.Arn
Export:
Name: !Sub '${AWS::StackName}-RoleArn'
LambdaRoleName:
Description: Lambda Execution Role Name
Value: !Ref LambdaExecutionRole
Export:
Name: !Sub '${AWS::StackName}-RoleName'
PolicyArn:
Description: Lambda Execution Policy ARN
Value: !Ref LambdaExecutionPolicy
Export:
Name: !Sub '${AWS::StackName}-PolicyArn'
実際に作成してみる
Qさんが教えてくれたコマンドを打ってCloudFormationを動かしてみます。
コンソールを確認すると、無事リソースが作成されていました![]()

ただ、よくよくコンソール確認してみるとLambdaのトリガー設定がうまくできていなかったので、今回は完璧なテンプレート作成とはなりませんでした。
ですが、たたき台としては申し分ないレベルでテンプレートが作れました!
おわりに
今回はAmazon Q Developerでできることを簡単に検証してみました。
プロンプトのせいか1発成功とはなりませんでしたが、ほぼやりたいことは実現できたのかなと思います。
Amazon Q Developerは他にも色々なことができるので、コード生成以外の検証も行ってみたいと思います!
以上、皆様のご参考になれば幸いです。