8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Q Developerでできることを検証してみた

8
Last updated at Posted at 2025-12-13

はじめに

Amazon Q Developerはどんなことができるのか検証してみたので、内容をまとめてみます!
この記事は、Japan AWS Jr. Champions Advent Calendar 2025 14日目の記事です:santa_tone2:
たくさんの 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ファイルが作成されました!
image.png

生成されたファイルの中身(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ファイル実行すると・・・成功のステータスが返ってきました:sunny:

✓ アップロード成功
URL: https://test-handson-bucket.s3.ap-northeast-1.amazonaws.com/image/test-image.jpg

コンソールでS3見に行ってもちゃんと上がっていますね!検証成功です:muscle:
image.png

② 既存リソースのCloudFormationテンプレートを作成してもらう

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

使用するプロンプト

既存リソースの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実行コマンドを教えてくれました。
image.png

生成されたテンプレートファイル
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を動かしてみます。
コンソールを確認すると、無事リソースが作成されていました:thumbsup:
image.png

ただ、よくよくコンソール確認してみるとLambdaのトリガー設定がうまくできていなかったので、今回は完璧なテンプレート作成とはなりませんでした。
ですが、たたき台としては申し分ないレベルでテンプレートが作れました!

おわりに

今回はAmazon Q Developerでできることを簡単に検証してみました。
プロンプトのせいか1発成功とはなりませんでしたが、ほぼやりたいことは実現できたのかなと思います。
Amazon Q Developerは他にも色々なことができるので、コード生成以外の検証も行ってみたいと思います!

以上、皆様のご参考になれば幸いです。

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?