はじめに
こんにちは!テクニカルインストラクターの青木です。
突然ですが、Amazon Bedrock というサービスをご存知でしょうか ? 2023 年の 9 月に一般提供された生成 AI アプリケーションの開発を支援するサービスです !
この記事では、Amazon Bedrock の初学者や興味がある方を対象に、Amazon Bedrock を用いた画像生成アプリケーション開発の流れを解説します。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
builders.flash メールメンバー登録
1. 今回開発するアプリケーションについて
今回開発するアプリケーションでは、ユーザーの任意の入力に対して画像を出力します。これを実現するために、Amazon Bedrock、AWS Lambda、Amazon S3、Amazon API Gateway というサービスを利用し、最終的に以下のアーキテクチャを設計します。(このアーキテクチャの解説は、後ほど行います。)
今回のアプリケーションを構築すると、使用したサービスごとに料金が発生するので、builders.flash のメールメンバー登録 の上、クレジットコードの当選にチャレンジしていただくのも良いと思います。

2. 利用するサービスについて
まずは、今回利用するサービスについて簡単に解説します。
3. 開発の流れ
それでは早速、開発の流れを手順に沿って解説していきます !
ポリシーの修正
「新しいステートメントを追加」から、ポリシーを修正していきます。
以下の権限を追加します。
Amazon Bedrock によって用意された 基盤モデルを実行するための権限
Stability AI 社の SDXL 1.0 に対して、 bedrock: InvokeModel アクションを許可
S3 バケットにオブジェクトを保存・取得する権限
作成した S3 バケットに対して、GetObject、PutObject アクションを許可
修正されたポリシー
最終的に、以下のようなポリシーになっていれば OK です !
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": [
"arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v1"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::{作成したバケット名}/*"
]
}
]
}
Lambda 関数を記述
それでは、 Lambda 関数の中身を記述していきましょう ! 今回、AWS SDK for Python (Boto3) を使って、コードを記述します。最終的なコードは以下の通りです。それぞれのコードで何をやっているのか、コメントを添えておきましたので、ご確認ください。
# 必要なライブラリを読み込み
import json
import boto3
import base64
import uuid
from botocore.config import Config
bedrock_runtime = boto3.client('bedrock-runtime')
# 署名プロセスには、署名バージョン4(SigV4)を指定
my_config = Config(region_name="us-east-1", signature_version="s3v4")
s3 = boto3.client("s3", config=my_config)
bucket_name = '作成したS3バケット名'
def lambda_handler(event, context):
# S3に保存するためのランダムなオブジェクト名を生成
random_uuid = uuid.uuid4().hex
# 入力を受け取る
input_text = event['input_text']
# Amazon Bedrockで用意した基盤モデルへAPIリクエストし、画像を生成する
response = bedrock_runtime.invoke_model(
body='{"text_prompts": [{"text":"'+input_text+'"}]}',
contentType='application/json',
accept='image/png',
modelId='stability.stable-diffusion-xl-v1'
)
s3_key = random_uuid + '.png'
# 生成された画像をS3にアップロード
s3.upload_fileobj(response['body'], bucket_name, s3_key, ExtraArgs={'ContentType': 'image/png'})
# 署名付きURLを取得
presigned_url = s3.generate_presigned_url('get_object',Params={'Bucket': bucket_name,'Key': s3_key},ExpiresIn=3600)
# 署名付きURLを返す
return {
'statusCode': 200,
'body': {'presigned_url': presigned_url}
}
Lambda 関数のタイムアウト値を変更
関数を手動実行
「Test」ボタンを押下し、関数を手動実行してみましょう ! すると、関数のレスポンス結果として、以下のように S3 の署名付き URL が返ってくることが確認できました。
{
"statusCode": 200,
"body": {
"presigned_url": "https://作成したS3バケット名.s3.amazonaws.com/951daf~.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASsaf~&X-Amz-Date=20240~&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQ2Bu~&X-Amz-Signature=a9~"
}
}
ブラウザで確認
この URL をコピぺし、ブラウザで確認してみましょう !
このように、画像が生成されているのが確認できました !! 🎉
実際に、該当の S3 バケットを見ても、オブジェクトが保存されていることが確認できるかと思います。

3-4. Amazon API Gateway で API を作成
3-5. フロントエンド作成
今回、以下のような簡易的なフロントエンドを用意しました。ここではフロントエンドについて詳しい解説はしませんが、上記で用意した API にリクエストを送り、返ってきた画像を表示しています。
以下のような画像生成アプリケーションが完成しました !!

作成した API を試す
フロントエンドを用意せずに、作成した API を試したい方は、コマンドラインインターフェイス (CLI) から試すこともできます。 CLI 上で、以下の curl コマンドを実行すると、S3 の署名付き URL が返ってくるのを確認できます。
$ curl -X POST {作成した API のエンドポイント} -H 'Content-Type: application/json' -d '{"input_text":"an image of cat"}'
オブジェクトをローカルにダウンロード
以下の curl コマンドで、返ってきた署名付き URL からオブジェクトをローカルにダウンロードできます。
$ curl -O "{レスポンスの署名付きURL}"
4. まとめ
今回、Amazon Bedrock を用いて画像生成のアプリケーションを開発し、その流れを解説しました。
具体的には、以下のようなアーキテクチャで、Amazon Bedrock によって画像生成用の API を有効にし、Lambda 関数が Amazon Bedrock の用意した API にリクエストを送り、生成された画像を S3 に保存します。
さらに、Lambda 関数は、S3 から署名付き URL を受け取ります。
最後に、Lambda 関数と Amazon API Gateway を組み合わせることでパブリックな API を用意し、フロントエンドで API リクエストを送れるようにしました。
Amazon Bedrock を用いることで、画面をぽちぽち押すだけで画像生成用の API が用意でき、そのおかげで機械学習に詳しくなくても、画像生成の部分を作り込まずにこのようなアプリケーションを開発できました ! また、画像生成だけでなく、チャットやテキスト要約などの API も今回と同じように簡単に使えます。
ご興味のある方は、ぜひ触ってみてください!
なお、Amazon Bedrock の他に生成 AI の活用するサービスとして Amazon CodeWhisperer の記事「Amazon CodeWhisperer を使ってみよう!」もありますので、よろしければ読んでみてください !

筆者プロフィール
アマゾン ウェブ サービス ジャパン合同会社
AWS トレーニングサービス本部 テクニカルインストラクター
”分かりやすい”をモットーに、日々 AWS のトレーニングの登壇をしています。
趣味はフットサル、筋トレ、サウナで、推しのサウナはウェルビー栄 (名古屋) です。

Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages