Amazon Q Developer を使って画像生成APIを実装する

Amazon Q Developer を使って画像生成APIを実装する

本記事はアジアクエスト Advent Calendar 2024の記事です。

目次

    概要

    クラウドインテグレーション部クラウドソリューション2課の川井です。

    今回は、Amazon Q Developerを活用して画像生成APIを実装していきます。

    Amazon Qとは、Amazon Web Services(以降、AWS)が提供する生成AIを活用したフルマネージド型のAIアシスタントサービスです。Amazon Qには、開発者向けの「Amazon Q Developer」と、ビジネス向けの「Amazon Q Business」があり、それぞれ利用者が異なります。

    Amazon Q Developer:アプリやソフトウェア開発を行う開発者(エンジニア)向け
    Amazon Q Business :企業や組織で働く従業員やビジネスプロフェッショナル向け

    どちらも自然言語での対話が可能で、ユーザーの質問に応じて情報を提供したり、タスクを支援したりしてくれます。

    今回使用するのは開発者向けの「Amazon Q Developer」です。

    Amazon Q Developerは、AWSコンソール、CLI、または統合開発環境(以降、IDE)を使用する際に、コードやタスクを効率化するためのサポートを提供します。開発者は、AWSリソースやアーキテクチャに関する質問や、ベストプラクティス、ドキュメントに基づくサポートを得ることができます。

    ですので、Amazon Q Developerには画像生成APIを作成するためのコード作成や改善、問題解決をサポートしてもらいます。

    また、画像生成APIにはAmazon EC2(以降、EC2)をAPIとして構築し、EC2に対して作成したい画像のクエリ文字列を追加して接続した際に、ブラウザにその画像が生成されるようにしていきます。

    ※補足
    API GatewayとLambdaを使う構成でも実装は可能ですが、Al関係のライブラリがLambda標準モジュールの中に入っていないため、Lambdaレイヤーの追加をしなければなりません。それが少々手間だと思ったため、今回はEC2をAPIとして構築しています。

    構成

    構成は以下のとおりとなりました。
    202412_qimage_1

    こちらの最終的な構成は、Amazon Q Developerにコードを繰り返し作成を依頼した結果、出来た構成となります。
    アプリケーションサーバにUvicornを使っているのは、Amazon Q Developerの判断になります。只、Amazon Bedrockの画像生成モデル(Stability AI)を使用して画像生成しているのは、Amazon Q Developerにこちらのモデルを使用するように依頼したためになります。

    そして、Amazon Q DeveloperはIDEのVSCodeから拡張機能をインストールして使用していきます。また、今回はAmazon Q Developer Proのライセンスを使用しているため、IAM Identity Centerを必要としています。無料プランで使用する場合は、AWS Builder IDでサインインするため、IAM Identity Centerは必要ありませんのでご注意ください。

    ※補足
    Amazon QやAmazon Bedrockの画像生成モデルは、東京リージョンでは使用できないため、リージョンはバージニア北部を使用しています。

    Amazon Q とは

    先ず、Amazon Q がどんなサービスなのか簡単に説明していきます。

    Amazon Qは、AWSが提供する生成AIアシスタントで従業員や開発者が効率的に情報を検索し、
    問題を解決し、タスクを完了するのを支援するサービスです。

    以下にその特徴をまとめます。

    🔲主な機能

    ● AIアシスタントとしての役割
    従業員や開発者が業務を効率化できるよう、情報の検索、問題の解決、ドキュメントの要約、コンテンツ作成を支援します。
    また、ユーザーの質問に対して適切な回答を提供し、タスクを完了するための手順をわかりやすく提示することで、
    業務の生産性向上をサポートします。

    ● 開発者支援
    コードの生成、変換、デバッグを支援することで、開発者の作業効率を向上させます。自然言語から自動的にコードを生成する機能を備え、
    複雑なコーディングプロセスを簡素化します。また、セキュリティ要件や特定のビジネスニーズに応じて、コードをカスタマイズする柔軟性も提供します。

    ● 業務効率化
    サプライチェーン管理やコンタクトセンターのタスクを自動化することで、業務プロセスを効率化します。
    これにより、ビジネスプロセス全体のパフォーマンスを向上させ、組織の生産性と効果的な運営を支援します。

    ● 統合されたデータ利用
    企業内のデータを分析して適切な情報を提供し、会社のポリシーや手順に関する質問に対応することで業務効率を支援します。

    ● サービス統合
    AWS QuickSight、Amazon Connectなどの既存サービスと統合して、レポート生成やチャットボット機能を強化します。

    🔲主な利用例

    ● BIツールの強化: AWS QuickSightと統合してレポート生成を効率化。
    ● コンタクトセンターの支援: Amazon Connectとの連携で問い合わせ対応を自動化。
    ● 生成AIによる支援: ドキュメント要約やコード生成をサポート。

    Amazon Q Developer とは

    次に、Amazon Q Developerが、何が出来るのかもう少し詳細に説明します。
    以下の「Amazon Q Developer とは何ですか?」というタイトルのドキュメントも参照してみてください。
    Amazon Q Developer とは何ですか?

    Amazon Q Developerの主な機能とユースケースを箇条書きにしたものが以下になります。

    🔲AWSコンソールでのエラー診断

    ・ 一般的なAWSコンソールエラーの診断と修正をサポートします。
    ・ リソースの作成時や他のユースケースにおけるエラーを理解・解決する手助けをしてくれます(以下のEC2コンソール画面参照)
    202412_qimage_2

    🔲副操縦士としてのコード支援

    ・ 開発者が自然言語で説明した機能に基づき、計画を立ててコードを生成します。
    ・ AWSプロジェクトの構築に役立つコンテキストに基づいた支援を提供します。

    → 今回使用する機能(APIのコード生成で使用します)

    🔲コードの理解と改善

    ・ 書かれたコードの内容を分析し、統合されたIDEでコードに関する提案を提供します。
    ・ コメントや既存のコードを解析して推奨事項を提示します。

    → 今回使用する機能(APIのコード生成で使用します)

    🔲言語バージョンの変換

    ・ 古いバージョン(例: Java 8)から新しいバージョン(例: Java 17)へのコード変換をサポートします。
    ※将来的には他のプログラミング言語への対応も予定

    詳細は以下の「Amazon Q Developer の高度な機能」というタイトルのドキュメント参照
    Amazon Q Developer の高度な機能

    🔲AWSサポートへの問い合わせ

    ・ 問題が発生した際に、AWSサポートエージェントとライブチャットが可能です。
    ・ チケットの送信やエクスポートケースの作成をサポートします。

    詳細は以下の「Use Amazon Q Developer to chat with AWS Support」というタイトルのドキュメント参照
    Use Amazon Q Developer to chat with AWS Support

    🔲AWS Chatbotとの統合

    ・ SlackやMicrosoft Teamsチャネルと統合し、ベストプラクティスやトラブルシューティングの質問に対応します。
    ・ 問題の特定と次のステップを案内します。

    詳細は以下の「Chatting with Amazon Q Developer in AWS Chatbot」というタイトルのドキュメント参照
    Chatting with Amazon Q Developer in AWS Chatbot

    環境構築(事前準備)

    🔲Amazon EC2インスタンス作成

    この検証において、事前準備することはAPIとして起動するEC2を作成することのみです。APIとして使用する際に必要なライブラリ等は、Amazon Q Developerが提示してくれます。

    そして、今回はブラウザ上で画像が生成されるようにしますので、EC2にパブリックIPが必要になります。また、Amazon Bedrockの画像生成モデルを使用しますので、EC2のIAMロールにAmazon Bedrockへの権限が必須となります。

    EC2作成の際に使用したイメージや必要な権限等を以下に記載します。

    Image: Amazon Linux 2023
    配置場所: Public Subnet(インターネットから通信が必要なので)
    セキュリティグループ
    インバウンド: 接続させるIPアドレス(全インターネットからのアクセス許可でも問題はありませんが推奨はしません)
    アウトバウンド: 全インターネットへのアクセス許可
    Role: Amazon Bedrockの権限と、AWS SSMの権限(セッションマネージャーを使わない場合不要)

    Amazon Q Developer Login

    では、Amazon Q Developer Proのライセンスを使用して、IDEのVSCodeからログインしていきます。
    無料プランとはログイン方法が異なりますのでご注意ください。また、AWS IAM Identity Center 関連の設定は省略します。

    🔲1. ユーザーをサブスクライブする

    先ず、リージョンをバージニア北部に変更します。
    Amazon Qのコンソール画面に移動したら以下の画像の順番通りに、
    ① Getting started
    ② Subscribe
    とクリックします。
    202412_qimage_3

    Subscribeをクリックすると、以下画像のポップアップが表示されますので、「Get started」をクリックします。  
    202412_qimage_4

    IAM Identity Centerで登録されているユーザーの名前を検索して「Done」をクリックします。
    202412_qimage_5

    問題なくサブスクリプションが割り当てられた場合、Amazon Qコンソール画面の「Subscriptions」で、
    先程選択したユーザーが追加されていることを確認します。
    202412_qimage_6

    これでユーザーにサブスクリプションが割り当てられましたので、Amazon Q Developerにログインしていきます。


    🔲2. VSCodeからログイン

    VSCodeからAmazon Q Developerにログインするためには、先ずAmazon Qの拡張機能をインストールします。拡張機能のマーケットプレイスから「Amazon Q」と検索すれば以下の画像と同様のものが表示されますのでインストールします。
    202412_qimage_7

    インストールが完了すれば、以下画像の左下赤枠のようにAmazon Qのアイコンが表示されます。クリックするとサインイン画面が表示されますので、黄色枠の「Use with Pro license」を選択して、その下の「Continue」をクリックします。
    202412_qimage_8

    「Start URL」には、SSOの開始URLを入力します。「Region」は、バージニア北部のままで問題ありません。
    入力が完了したら「Continue」をクリックします。
    202412_qimage_9

    ※補足
    「Start URL」はどこから確認していただいてもいいのですが、確実なのは AWSコンソール画面で「Amazon Q Developer」と検索していただき、Amazon Q Developerコンソール画面の「Settings」にStart URLが表示(画像の黄色枠)されていますので、こちらをコピーしてください。
    202412_qimage_10

    Continueをクリックしますと、以下画像のように表示されていますので「開く」をクリックします。
    202412_qimage_11

    AWSにログインする際の認証画面が表示されます。サインインが完了すれば以下画面のように表示されますので「アクセス許可」をクリックします。
    202412_qimage_12

    アクセス許可が成功すれば以下画面のように表示されます。
    202412_qimage_13

    VSCodeに戻りますと、Amazon Qが使用できるようになっていることが確認出来ます。
    202412_qimage_14

    これで、Amazon Q Developerへのログインが完了しました。

    画像生成API作成

    🔲1. Amazon Q Developer Agent(/devコマンド)実行

    VSCodeで、Amazon Q Developerが使用できるようになりましたので画像生成APIのコードを作成していきます。
    Amazon Q Developerでコード生成していく訳ですが「/devコマンド」を使用していきます。

    /devコマンドとは?
    以下のドキュメントによると、Amazon Q Developer Agent for software development(/devコマンド)は、IDEでコード機能の開発やコード変更を支援します。現在のプロジェクトやワークスペースのコンテキストを活用して、変更を実装するためのコードを自動生成し、AWSプロジェクトや独自アプリケーションの構築をサポートします。
    Developing features with Amazon Q Developer

    との事ですが、要は新しいコード機能を作成したり、既存のプロジェクトに直接変更を加えたりするのを支援するために設計された強力なソフトウェア開発に特化した機能という事です。

    では、実際使用していきます。

    Amazon Q Developerが使用できる状態になっていますので、以下画像の「New tab」をクリックします。
    202412_qimage_15

    すると、Chatのタブが追加されますので、そこに以下画像のように「/dev」と検索窓に入力してエンターキーを押します。
    202412_qimage_16

    Chatタブが「Q - Dev」というタブに変更されました。これでAmazon Q Developer Agentによるコード生成が実施できます。
    202412_qimage_17

    🔲2. 画像生成APIコード作成

    では、画像生成APIコードの作成をしてもらいます。まだ、日本語対応していませんので英語でお願いすることにします。

    先ずは、ざっくりとした内容で以下のプロンプトを入力します。

    I want you to create an image generation API.(画像生成APIを作成して欲しい)
    202412_qimage_18

    Amazon Q Developer Agentによってのコード生成は少々時間が掛かります。

    しばらく待っていると、「main.py」、「requirements.txt」、「README.md」という、3つのファイルが作成されたようです。実際はまだ作成された訳ではなく、このようなファイルを作成しますよという段階です。「Accept all changes」をクリックすると実際に3つのファイルを作成することができます。
    202412_qimage_19
    202412_qimage_20

    以下画像が表示内容を拡大したものです。
    202412_qimage_21

    実際にファイルを作成する前に、各ファイルの中身を確認することも出来ます。「Code suggestions」という箇所の、ファイル名をクリックしますと各ファイルに記載された内容が確認出来ます。緑線は新しく作成されたコードです。

    ・main.py
    202412_qimage_22

    ・requirements.txt
    202412_qimage_23

    ・README.md
    202412_qimage_24

    ファイルの中身を確認して問題ないということであれば「Accept all changes」をクリックして各ファイルを作成します。 
    202412_qimage_25

    「Accept all changes」をクリック後、実際に先程の3つファイルが作成されていることを確認することができます。
    202412_qimage_26


    各ファイルの中に記載されている内容ですが、
    main.pyには、画像生成APIを作成するためのコードがPythonで記載されています。

    また、README.mdには、このAPIを実装するための手順が記載されています。全てが役立つ内容ではないですが、これを読めばなんとなくAPI実装のやり方がイメージ出来ます。一部抜粋したものを以下に示します。

    ## Installation

    1. Clone the repository
    2. Install dependencies:
    - pip install -r requirements.txt

    ## Running the Application

    Run the application using:
    - python main.py

    The server will start on `http://0.0.0.0:80`

    そして、requirements.txtのファイルにはREADME.mdの手順にも記載されている、‘pip install -r requirements.txt‘というコマンドで、今回の画像生成APIの実装で必要なPythonライブラリの種類が記載されています。

    fastapi==0.68.1
    uvicorn==0.15.0
    Pillow==8.3.2
    numpy==1.21.2

    ですので、‘pip install -r requirements.txt‘を実行すれば、必要なPythonライブラリがインストールされるということです。
    これは便利ですね。

    また、Amazon Q Developerはコード解説も行ってくれます。コード解説を行って欲しいファイルで、
    「右クリック → Amazon Q → Explain」 と選択します。
    202412_qimage_27

    すると、Chatタブにコードの解説が表示されます。まだ、英語のみしか対応していませんので、
    全て英語での記載にはなりますが、このような機能もAmazon Q Developerにはあります。
    202412_qimage_28
    202412_qimage_29


    🔲3. Amazon Bedrockの画像生成モデル使ったAPIコード作成

    先程の作成されたコードでは、Amazon Bedrockは使用されていないので、Amazon Bedrockの画像生成モデルを使ってAPIを実装したいと思います。再度英語でお願いしてみます。

    I would like you to create an API using Amazon Bedrock's image generation model.(Amazon Bedrockの画像生成モデルを使用してAPIを作成して欲しいです。)

    202412_qimage_30
    Amazon Q Developer Agentでは、再度プロンプトによる指示による実行を行うと、先程作成したコードを基にコードの変更を行ってくれます。

    以下画像の実行結果を確認すると、先程のコードを基に新しく作成(Created)したファイル、変更(Changed)したファイルなどの出力結果が示されています。また、変更があったファイルを選択すると、画像の左側は変更前のファイルが、右側には新しくコードが追加されたファイルが表示され、その差分が緑線で示されています。
    202412_qimage_31

    以下画像が表示内容を拡大したものです。
    202412_qimage_32

    先程の1度の変更では、期待したコードに作成されなかったため、プロンプトの内容を変更して複数回コードの再作成を行っております。
    今回はEC2からAmazon Bedrockにアクセスする際にIAMロールを使いますので、アクセスキーやシークレットキーなどは不要なのですが、
    上記の画像のコードではそれらを使ってアクセスするようにコードが変更されています。ですので、Amazon Q Developer Agentでこちらが求める内容のコードにするまでには少々苦労しました(今後改善されていくるとは思いますが)

    そして、完成したコードが以下のコードになります。何度かコードの再作成を行っていますので、余分なコードが作成されていたり、ファイル名も変わってしまっているものもありますが、そこはご了承ください。

    ・app.py

    from fastapi import FastAPI, Response
    from PIL import Image
    import io
    import numpy as np
    import boto3
    import json
    import base64

    app = FastAPI()

    # Initialize Bedrock client
    bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')


    @app.get("/")
    async def root():
    return {"message": "Welcome to the Image Generation API"}

    @app.get("/generate/random")
    async def generate_random_image(width: int = 400, height: int = 400):
    # Create a random RGB image
    random_image = np.random.randint(0, 255, (height, width, 3), dtype=np.uint8)

    # Convert numpy array to PIL Image
    img = Image.fromarray(random_image)

    # Save image to bytes
    img_byte_arr = io.BytesIO()
    img.save(img_byte_arr, format='PNG')
    img_byte_arr = img_byte_arr.getvalue()

    return Response(content=img_byte_arr, media_type="image/png")

    @app.get("/generate/gradient")
    async def generate_gradient(width: int = 400, height: int = 400):
    # Create a gradient image
    x = np.linspace(0, 1, width)
    y = np.linspace(0, 1, height)
    X, Y = np.meshgrid(x, y)
    gradient = (X + Y) * 127.5
    gradient_image = np.stack([gradient, gradient, gradient], axis=-1).astype(np.uint8)

    # Convert numpy array to PIL Image
    img = Image.fromarray(gradient_image)

    # Save image to bytes
    img_byte_arr = io.BytesIO()
    img.save(img_byte_arr, format='PNG')
    img_byte_arr = img_byte_arr.getvalue()

    return Response(content=img_byte_arr, media_type="image/png")

    @app.get("/generate/bedrock")
    async def generate_bedrock_image(prompt: str):
    # Prepare the request body for Stable Diffusion
    request_body = {
    "text_prompts": [{"text": prompt}],
    "cfg_scale": 10,
    "steps": 50,
    "seed": 0
    }

    # Invoke Bedrock's Stable Diffusion model
    response = bedrock.invoke_model(
    modelId="stability.stable-diffusion-xl-v1",
    body=json.dumps(request_body)
    )

    # Parse the response
    response_body = json.loads(response['body'].read())
    image_data = response_body['artifacts'][0]['base64']

    # Convert base64 to bytes
    image_bytes = base64.b64decode(image_data)

    return Response(content=image_bytes, media_type="image/png")

    if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=80)

    ・requirements.txt

    fastapi
    uvicorn
    pillow
    numpy
    boto3

    ・README.md

    # Image Generation API
    This is a simple API for generating images using Python, FastAPI, and Pillow.

    ## Installation
    1. Create a virtual environment (optional but recommended):

    > python -m venv venv
    > source venv/bin/activate # On Windows: venv\Scripts\activate

    2. Install dependencies:

    > pip install -r requirements.txt

    ## Running the API
    Run the API server with:

    > python app.py

    ## API Endpoints

    ### 1. Root endpoint
    - URL: `/`
    - Method: GET
    - Description: Welcome message

    ### 2. Generate Random Image
    - URL: `/generate/random`
    - Method: GET
    - Query Parameters:
    - width (optional, default: 400): Image width in pixels
    - height (optional, default: 400): Image height in pixels
    - Returns: PNG image

    ### 3. Generate Gradient Image
    - URL: `/generate/gradient`
    - Method: GET
    - Query Parameters:
    - width (optional, default: 400): Image width in pixels
    - height (optional, default: 400): Image height in pixels
    - Returns: PNG image

    ## Example Usage
    1. Get a random image:
    http://0.0.0.0:80/generate/random?width=800&height=600

    2. Get a gradient image:
    http://0.0.0.0:80/generate/bedrock?prompt=A beautiful sunset over the mountains

    画像生成API実行

    では、APIのコードが完成しましたのでEC2に接続して、先程作成されたREADME通りに実装を行っていきます。

    🔲1. 事前準備(Amazon Bedrockモデルのアクセス許可)

    今回作成されたコードでは、Amazon Bedrockのモデルである「Stability AI」を使用していますので、もしAmazon Bedrockでこのモデルへのアクセス許可をしていない場合はモデルが使用出来ませんので、APIを実装する前にモデルへのアクセス許可しておいてください。
    202412_qimage_33

    ※余談
    Stability AIは、もうレガシーなモデルようなので、実際に画像生成モデルを使用する場合は「Stable Diffusion」などを、
    使用した方がいいと思います。

    🔲2. 仮想環境作成

    先ず、仮想環境を作成していきます。

    > python3 -m venv venv

    venvは、仮想環境名前です。
    EC2はPython3がインストールされていますので、README通りのpythonだと作成出来ませんでしたので、Python3に変更して実行しています。

    仮想環境を作成したら、以下のコマンドでその仮想環境をアクティブにします。
    これにより、インストールしたパッケージがその環境にのみ適用されるようになります。

    > source venv/bin/activate

    以下画像のようになれば仮想環境作成成功です。
    202412_qimage_34

    🔲3. Pythonライブラリインストール

    ※Pythonライブラリをインストールする前に、作成したapp.pyとrequirements.txtファイルをEC2内に作成しておきます。
    続いて、Pythonライブラリをインストールしていきます。

    > pip install -r requirements.txt

    🔲4. API実行

    インストールが完了したらAPIを実行していきます。app.pyを作成したディレクトリで以下のコマンドを実行します。

    > python3 app.py

    以下画像のようになればAPIの起動成功です。
    202412_qimage_35

    では、EC2に接続していきます。EC2のパブリックIPに「generate/bedrock」のパスを入れて、その後にクエリ文字列を入れていきます。クエリ文字列の入れ方は「?prompt=作成したい画像」です。この書き方も、READMEに記載されていますので、先ずはREADMEに記載されている通り実行していきます。

    http://パブリックIP:80/generate/bedrock?prompt=A beautiful sunset over the mountains

    ブラウザ上で山々に沈む美しい夕日の画像が作成されました。
    202412_qimage_36

    次に、犬の画像を作成してみます。

    http://パブリックIP:80/generate/bedrock?prompt=A beautiful dog

    ブラウザ上で美しい犬の画像が作成されました。
    202412_qimage_37

    以上、Amazon Q Developer を使って画像生成APIを実装してみました。

    まとめ

    今回は、AWSで注目されているサービスでありますAmazon Q Developerを使用して画像生成APIを実装してみました。
    正直まだ発展途上の段階だと思う部分もありますが、Amazon Qは注目されているサービスなだけに日々アップデートがされていますので、これからより便利になっていくと思います。ですので、これからのAmazon Qのアップデート情報に注目していきたいと思います。

    では、また別の記事を執筆しますので、引き続きよろしくお願いいたします。
    ありがとうございました。


    クラウドインテグレーション部
    クラウドソリューション2課
    川井 康敬

    アジアクエスト株式会社では一緒に働いていただける方を募集しています。
    興味のある方は以下のURLを御覧ください。