まず最初に料金の話
-
今回は 「Stability AI/SDXL 1.0(Stable Diffusion XL 1.0)」を使用します
- 画面解像度:1024 x 1024 まで
- ステップ数:多いほどより詳細で高画質な画像を生成することが可能だが処理時間も増加
- むやみやたらに生成しすぎると金額が多く掛かります。節度を持って!
今回作成するサービスについて
-
生成AIのAWSサービスと他AWSサービスを連携して、小さいマイクロサービスを作ってみよう
- 「外部よりプロンプトを指定してURLを叩くと、画像が生成される」システム
-
以下が作成する構成図
- 私たちは AWS Lambda を叩き、署名URLを受け取る
- AWS Lambda が Amazon Bedrockで生成AI(Stability AI)に生成をお願いし、画像を受け取る
- AWS Lambda が 生成された画像をS3に保存し、署名URLを受け取る
クォータ的に1分に60回以上叩くと止まるので、控えめに叩いてね
ハンズオン
①Amazon Bedrock:Stability AI が利用可能であることを確認
- AWSにアクセス
- Amazon Bedrock にアクセス
-
リージョンを us-east-1 であることを確認
※ 画像生成AIは現在 (2024/06/10)、東京リージョンでは取り扱っておりません -
モデルアクセス にアクセスします
手順
- 左上のハンバーガーメニューをクリックする
- 左下の「モデルアクセス」をクリック
- Stability AI の 「SDXL 1.0」 について、「アクセスが付与されました」となっていることを確認
💡
※ 事前に「モデルアクセスのリクエスト」を行っています。
⇒ 使用したいAIを利用したい旨をAWSにリクエストします。初期は何も使用できません。
⇒ 使用したいAIを利用したい旨をAWSにリクエストします。初期は何も使用できません。
リクエストする方法
- 「リクエスト可能」を押下し、モデルアクセスをリクエストを押下
- すると選択できるようになるので、選択して「Next」を押下
-
確認画面がでるのでSubmitを押す
※ Claude 3 Haiku を使用する際は利用者情報を入力する必要があります
②コンソール上からStability AI を使用してみる
- 先程のハンバーガーメニューより、「プレイグラウンド/イメージ」を押下
- 「モデルを選択」を押下
- SDXL 1.0 モデルを選択し、「適用」を押下します
- 下方の入力箇所に画像生成させたい言葉を入れて「実行」を押下
- 生成されたことを確認します
- これで体験は以上です
スタイルを加えると幅が広がったり…。
富士山を「pixel art」風に
③Amazon S3:画像の保存用リソースを作成
- Amazon S3 にアクセス
- 「バケットを作成」を押下
-
バケット名を「
bucket-bedrock-sdxl-
&任意の英数字
」と入力例
bucket-bedrock-sdxl-aiueo
- 他はデフォルトで、「作成」を押下
- 作成されたS3にアクセス
- プロパティを押下
-
Amazon リソースネーム(ARN)をコピーし、メモ
例
arn:aws:s3:::bucket-bedrock-sdxl-aiueo
-
S3の作成完了
※コピーしたARNは⑤IAMで使用します
④AWS Lambda:外部との連携用関数を作成
-
AWS Lambda にアクセス
手動
- Lambda と検索
- 左側のハンバーガーメニューを押下
- 関数を押下
- 「関数の作成」を押下
-
関数名を「
bedrock-sdxl-
&任意の英数字
」とし、ランタイムを Python 3.12 とする例
bedrock-sdxl-aiueo
- 他はデフォルトで「関数の作成」を押下
-
コードソースに以下のコードを貼り付け
コード
# 必要なライブラリを読み込み import json import boto3 import base64 import uuid import urllib.parse 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 = 'bucket-bedrock-sdxl-&任意の英数字' def lambda_handler(event, context): # S3に保存するためのランダムなオブジェクト名を生成 random_uuid = uuid.uuid4().hex # 入力を受け取る try: if 'version' in event.keys(): if 'body' not in event.keys(): param = event['queryStringParameters'] else: param = json.loads(event['body']) prompt = param['prompt'] else: return { 'statusCode': 200, 'body': {'text': 'This is a test result. If you want to generate an image, please specify the `prompt` key in the URL query or POST request.'} } except Exception as e: return { 'statusCode': 400, 'body': {'text': f'Occuerd Error by using Japanese or other things :{e}'} } # Amazon Bedrockで用意した基盤モデルへAPIリクエストし、画像を生成する response = bedrock_runtime.invoke_model( body='{"text_prompts": [{"text":"'+prompt+'"}]}', 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': json.dumps(presigned_url) }
-
&任意の英数字
となっているところを、先程作成したS3のバケット名に合う用に修正-
例
bucket_name = 'bucket-bedrock-sdxl-aiueo'
-
例
- 「Deploy」を押下
-
Lambda 関数のタイムアウト値を変更
※ 画像生成は 10 ~ 60秒程度掛かります- 「設定」を押下
- 「一般設定」の「編集」を押下
- 「タイムアウト」を3分0秒に変更する
- 「保存」を押下
- 完了
⑤IAM:AWS Lambda からの各サービスへの実行権限を付与
- 「設定」をクリック
- 「アクセス権限」のタブをクリック
- 「ロール名」のリンクをクリック
- 「許可ポリシー」の「ポリシー名」をクリック
- 「編集」をクリック
💡
以下の権限を追加します!
-
Amazon Bedrock によって用意された 基盤モデルを実行するための権限
- Stability AI 社の SDXL 1.0 に対して、 bedrock: InvokeModel アクションを許可
-
S3 バケットにオブジェクトを保存・取得する権限
- 作成した S3 バケットに対して、GetObject、PutObject アクションを許可
-
Bedrock InvokeModel 用のステートメントを追加
- 「新しいステートメントを追加」をクリック
-
右側の「アクションを追加」より、以下にチェック
アクション:Bedrock → InvokeModel
- 右側の「リソースを追加」を押下
-
以下を選択/入力し、押下します
-
サービス:
Bedrock
-
リソースのタイプ:
foundation-model
-
リソースARN:
arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v1
-
サービス:
-
S3 GetObject/PutObject 用のステートメントを追加
- 「新しいステートメントを追加」をクリック
-
右側の「アクションを追加」より、以下にチェック
アクション:S3 → GetObject, PutObject(複数選択)
- JSONの方が以下のようになっているはず
- 右側の「リソースを追加」を押下
-
以下を選択/入力し、押下します
-
サービス:
S3
-
リソースのタイプ:
object
-
リソースARN:
&先程メモしたS3のARN
/*
-
/*
を必ずつけてください -
例:
arn:aws:s3:::bucket-bedrock-sdxl-aiueo
/*
-
-
サービス:
- 右下の「次へ」を押下
- 「変更を保存」を押下
- 完了
⑥AWS Lambda:外部より画像が生成できることを確認
- 先程作成した AWS Lambda に戻る
-
AWS Lambda 特有の機能「関数URL」を用いて、外部より
Lambdaだけで
関数を呼び出せるようにします(
気になった人は
)
- 「設定」を押下
- 「関数URL」を押下
- 「関数URLを作成」を押下
-
「認証タイプ」を「NONE」に変更
😡通常運用時は 必ずNONEを使わない こと
- 「保存」を押下
-
関数URLが生成されたと思うので、メモする(
&関数URL
)
-
例
https://wcw333zdp63oldo3ygkchyu6xi0btnza.lambda-url.us-east-1.on.aws/
-
例
-
以下2通りのいずれかで叩いてみてください。
-
(英語のみ使用可能)ブラウザでURLをURLクエリ付きで叩く
&関数URL?prompt=&描写したい指令
例
https://wcw333zdp63oldo3ygkchyu6xi0btnza.lambda-url.us-east-1.on.aws/?prompt=an_image_of_a_cat
-
(日本語に対応)Cloud Shell を使用し、POSTする
- AWS上部にあるマークからCloud Shell を起動する
-
CLIが表示されたら、以下を入力する
curl '&関数URL' \ -H 'content-type: application/json' \ -d '{ "prompt": "&描写したい指令" }'
例
curl 'https://wcw333zdp63oldo3ygkchyu6xi0btnza.lambda-url.us-east-1.on.aws/' \ -H 'content-type: application/json' \ -d '{ "prompt": "サンドイッチ" }'
-
(英語のみ使用可能)ブラウザでURLをURLクエリ付きで叩く
-
S3の署名URLが返却される
CloudShellを用いたPOSTの場合
[cloudshell-user@ip-10-130-86-160 ~]$ curl 'https://wcw333zdp63oldo3ygkchyu6xi0btnza.lambda-url.us-east-1.on.aws/' \ > -H 'content-type: application/json' \ > -d '{ "prompt": "サンドイッチ" }' "https://bucket-bedrock-sdxl-aiueo.s3.amazonaws.com/d7efe3c7f2b4473e869957cd9dfaa0ae.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIA6A3KW7MM5MQGU2LA%2F20240528%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240528T102637Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHMaCXVzLWVhc3QtMSJIMEYCIQDdJnyftt8iBdKkXZNyn8YomFmwwHTTdXqw1QXmMlp%2BGwIhAIWQQfvL%2FF6fIPx%2BUfKdhQzA7Wp4uUAhKl4DMe3Lz6IoKocDCOz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQAhoMOTYzOTA3MDkxMjI1IgwYrLmEUESRE3yZ2K0q2wK1c9i8TRI5QdX9RWqXL3H6pGNPAvlroQwcrbrcnAOCwJKPmiwctCbQ%2BRgf8dSbMQ89QXuT6%2Buc6Trs7dvuS7mZxKSB62rrttAKzb5GWoum0yztr5snKuag8vofl8KgJnWJfbrL06Mo6UoGWMKC4XojkRp7eGHnAb57AWInlkJsa%2BwI0%2BP5g9EcBrcIEUdZlm%2F4TGx8MgVep5wJfNaDTyqWTFfpQJ%2BeuWbRo70N8mPSlmFGpUAoyF0WqeFZB0gh7yw4dWqxiZ7pGYYvyufk2FaIb0gejYWSVIAcShNYJGM6W2Fuhl7lQYAEDY9XUycnBdFNVCV174zha5kqwfxngRBcgZGUWTL%2BaB8vN7JOekZKrc2rCrlUEAvbZ9i12h6zPWAGgFWAh6djuxw7HkWYKF6R2cTJ45LJkCFCA%2FvYUICu%2Bm2Ht8qcIcMJMEU5FQXLkeIhd49rNeNOAVmn%2BzD04dayBjqdARuys%2B4zSn7gOQItgEFBR0J3zgki5GFHH40yabatW7bQHUTfisgk284n4Nd3Mt8NuOzLIpRVMXRzTaROX20QqpkZMHl%2F2rZOBvUdDSGVuL4tmu6YgRHutDcMd%2Fxd2fU0SVMiizBNxmf3SU9Mv%2BRb0vhcEUDsFLqeaTvFH0WJALlqHOlpTx03XFdtDNDJmHDa7WqIykQaRgm95nd5%2BEI%3D&X-Amz-Signature=25d6ee4526340f96bb09cb991491b0bce04fcd57f33728426741b6d0175b345a"
-
署名URLを開くと、生成された画像を見れる
例
- CloudShell
-
image of sandwich
指定