AWSを使用したジェネレーティブAIを使用したサーバーレスイメージ生成アプリケーション
『ジェネレーティブAIとAWSを活用したサーバーレスイメージ生成アプリケーション』
パーソナライズされたコンテンツの作成やユーザーの好みに合わせた画像の作成など、説明に基づいて視覚的なアセットを生成する能力は非常に強力です。ただし、テキストから画像への変換は通常、リソースを消費する機械学習ソリューションの展開を含みます。この能力が API 呼び出しで利用できるなら、開発者にとってプロセスがより簡単でアクセスしやすくなるでしょう。
このチュートリアルでは、AWS CDK を使用して、AWS Lambda と Amazon Bedrock を使ったサーバーレス画像生成アプリケーションのデプロイ方法を解説します。Amazon Bedrock は、API を介して Amazon やサードパーティのモデルプロバイダ(Anthropic、Cohere など)からのベースモデルを提供する完全マネージドサービスです。開発者は単一の API を使用して主要な基盤モデルを活用し、将来的に新しいモデルを採用する柔軟性を保つことができます。
このソリューションは、Amazon S3 にホストされた静的ウェブサイトとして展開され、Amazon CloudFront ドメイン経由でアクセスできます。ユーザーは画像の説明を入力し、それが Lambda 関数(Amazon API Gateway 経由)に渡され、Amazon Bedrock 上の安定した拡散モデルが画像を生成します。
このソリューション全体は Go を使用して構築されています。これには Lambda 関数(aws-lambda-go ライブラリを使用)および AWS CDK を使用した完全なソリューションのデプロイが含まれます。
- 「類推的な & ステップバック型プロンプティング:Google DeepMindの最新の進歩に潜入する」
- 「DeepMindのAlphaFoldによる生体分子予測の革命」
- 「NASAのドラゴンフライがタイタンの大気を飛び越える準備をしています」
コードは GitHub で利用できます。
前提条件
このチュートリアルを開始する前に、次のものが必要です:
この GitHub リポジトリをクローンし、適切なディレクトリに変更します:
git clone https://github.com/build-on-aws/amazon-bedrock-lambda-image-generation-golangcd amazon-bedrock-lambda-image-generation-golang
AWS CDK を使用してソリューションをデプロイする
デプロイを開始するには、単純に cdk deploy
を呼び出します。
cd cdkexport DOCKER_DEFAULT_PLATFORM=linux/amd64cdk deploy
作成されるリソースのリストが表示され、進行するために確認が求められます(出力は簡潔にするために短縮されています)。
Bundling asset BedrockLambdaImgeGenWebsiteStack/bedrock-imagegen-s3/Code/Stage...✨ Synthesis time: 7.84s//.... 省略このデプロイメントは、現在のセキュリティ承認レベルに基づいて潜在的に敏感な変更を行います(--require-approval broadening)。次の変更を行う意図があることを確認してください://.... 省略これらの変更をデプロイしますか (y/n)? y
これにより、アプリケーションに必要な AWS リソースの作成が開始されます。
裏側で使用される AWS CloudFormation テンプレートを確認したい場合は、cdk synth
を実行し、cdk.out
フォルダを確認してください。
進捗状況をターミナルで確認するか、AWS コンソールに移動してください:CloudFormation > Stacks > BedrockLambdaImgeGenWebsiteStack
。
すべてのリソースが作成されたら、アプリケーションを試すことができます。次のようなものがあるはずです:
- 画像生成 Lambda 関数および API Gateway
- ウェブサイトの HTML ページをホストする S3 バケット
- CloudFront ディストリビューション
- IAM ロール、権限、S3 バケットポリシーなどのその他のコンポーネント
CloudFrontディストリビューションの作成は時間のかかるプロセスであるため、デプロイに少し時間がかかる場合があります。完了したら、S3バケット名、API Gateway URL、およびCloudFrontドメイン名の値が確認できるはずです。
HTMLページを更新し、S3バケットにコピーする
GitHubリポジトリのindex.html
ファイルを開き、次のテキストを見つけます:ENTER_API_GATEWAY_URL
。これを、上記のCDKデプロイの出力として受け取ったAPI Gateway URLで置き換えてください。
ファイルをS3にコピーするには、以下のAWS CLIを使用しました:
aws s3 cp index.html s3://<CDK出力からのS3バケットの名前>
ファイルがアップロードされたかどうかを確認します:
aws s3 ls s3://<CDK出力からのS3バケットの名前>
これでウェブサイトにアクセスする準備が整いました!
ソリューションの確認
ウェブブラウザにCloudFrontのドメイン名を入力してウェブサイトに移動します。プロンプトとして使用できる事前入力済みの説明が表示されるはずです。
処理を開始するには、画像を生成をクリックします。数秒後に生成された画像が表示されるはずです。
モデルパラメータの変更
Stability Diffusionモデルでは、必要に応じて生成パラメータを調整することができます。
Stability.ai Diffusionモデルは、以下のコントロールをサポートしています:
- Prompt strength (
cfg_scale
)は、画像のプロンプトへの忠実度を制御し、低い値ほどランダム性が増します。 - Generation step (
steps
)は、結果の正確さを決定し、ステップ数が多いほどより精密な画像が生成されます。 - Seed (
seed
)は、初期ノイズレベルを設定し、同じシードと設定を使用して再現可能な結果を得ることができます。
これらを編集するには、構成を表示をクリックします。
cfg_steps
とsteps
の最大値はそれぞれ30と150です。
クリーンアップを忘れずに
終了後、すべてのサービスを削除するには、次のようにしてください:
cdk destroy#output prompt (choose 'y' to continue)Are you sure you want to delete: ベッドロックLambdaイメージジェンウェブサイトスタック (y/n)?
完全なソリューションのセットアップとお試しを行うことができました。まとめる前に、コードの重要な部分をいくつか見て、裏側で何が行われているかをより良く理解してみましょう。
コードの解説
重要な部分にのみ焦点を当てるため、コードの一部(プリントステートメント、エラーハンドリングなど)は省略されています。
CDK
CDKコードはこちらを参照できます。
最初にAPI GatewayとS3バケットを作成します。
apigw := awscdkapigatewayv2alpha.NewHttpApi(stack, jsii.String("image-gen-http-api"), nil) bucket := awss3.NewBucket(stack, jsii.String("website-s3-bucket"), &awss3.BucketProps{ BlockPublicAccess: awss3.BlockPublicAccess_BLOCK_ALL(), RemovalPolicy: awscdk.RemovalPolicy_DESTROY, AutoDeleteObjects: jsii.Bool(true), })
次に、CloudFront Origin Access Identityを作成し、S3バケットにCloudFront Origin Access Identity主体への読み取りアクセス許可を付与します。その後、CloudFrontディストリビューションを作成します:
- S3バケットをオリジンとして指定します。
- 前に作成したOrigin Access Identityを指定します。
oai := awscloudfront.NewOriginAccessIdentity(stack, jsii.String("OAI"), nil) bucket.GrantRead(oai.GrantPrincipal(), "*") distribution := awscloudfront.NewDistribution(stack, jsii.String("MyDistribution"), &awscloudfront.DistributionProps{ DefaultBehavior: &awscloudfront.BehaviorOptions{ Origin: awscloudfrontorigins.NewS3Origin(bucket, &awscloudfrontorigins.S3OriginProps{ OriginAccessIdentity: oai, }), }, DefaultRootObject: jsii.String("index.html"), //S3のファイル名 })
それでは、イメージ生成のためのLambda関数と、関数の実行IAMロールへのIAM権限(Bedrock操作の呼び出しを許可する)を作成します。
function := awscdklambdagoalpha.NewGoFunction(stack, jsii.String("bedrock-imagegen-s3"), &awscdklambdagoalpha.GoFunctionProps{ Runtime: awslambda.Runtime_GO_1_X(), Entry: jsii.String(functionDir), Timeout: awscdk.Duration_Seconds(jsii.Number(30)), }) function.AddToRolePolicy(awsiam.NewPolicyStatement(&awsiam.PolicyStatementProps{ Actions: jsii.Strings("bedrock:*"), Effect: awsiam.Effect_ALLOW, Resources: jsii.Strings("*"), }))
最後に、Lambda関数をAPI Gatewayと統合し、HTTPルートを追加し、API Gatewayのエンドポイント、S3バケット名、CloudFrontドメイン名をCloudFormationの出力として指定します。
functionIntg := awscdkapigatewayv2integrationsalpha.NewHttpLambdaIntegration(jsii.String("function-integration"), function, nil) apigw.AddRoutes(&awscdkapigatewayv2alpha.AddRoutesOptions{ Path: jsii.String("/"), Methods: &[]awscdkapigatewayv2alpha.HttpMethod{awscdkapigatewayv2alpha.HttpMethod_POST}, Integration: functionIntg}) awscdk.NewCfnOutput(stack, jsii.String("apigw URL"), &awscdk.CfnOutputProps{Value: apigw.Url(), Description: jsii.String("API Gatewayのエンドポイント")}) awscdk.NewCfnOutput(stack, jsii.String("cloud front domain name"), &awscdk.CfnOutputProps{Value: distribution.DomainName(), Description: jsii.String("CloudFrontのドメイン名")}) awscdk.NewCfnOutput(stack, jsii.String("s3 bucket name"), &awscdk.CfnOutputProps{Value: bucket.BucketName(), Description: jsii.String("S3バケット名")})
Lambda関数
こちらでLambda関数のコードを参照できます。
関数のハンドラでは、HTTPリクエストボディからプロンプトを抽出し、クエリパラメータから構成を取得します。そして、bedrockruntime.InvokeModel関数を使用してモデルを呼び出します。Amazon Bedrockへ送信されるJSONペイロードは、Request
構造体のインスタンスで表されている点に注意してください。
Amazon Bedrock Stability Diffusionモデルから返される出力ボディは、base64
文字列として生成されたイメージを含むResponse
構造体に変換されます。これは、CORS
ヘッダーと共に、events.APIGatewayV2HTTPResponseオブジェクトとして返されます。
func handler(ctx context.Context, req events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) { prompt := req.Body cfgScaleF, _ := strconv.ParseFloat(req.QueryStringParameters["cfg_scale"], 64) seed, _ := strconv.Atoi(req.QueryStringParameters["seed"]) steps, _ := strconv.Atoi(req.QueryStringParameters["steps"]) payload := Request{ TextPrompts: []TextPrompt{{Text: prompt}}, CfgScale: cfgScaleF, Steps: steps, } if seed > 0 { payload.Seed = seed } payloadBytes, err := json.Marshal(payload) output, err := brc.InvokeModel(context.Background(), &bedrockruntime.InvokeModelInput{ Body: payloadBytes, ModelId: aws.String(stableDiffusionXLModelID), ContentType: aws.String("application/json"), }) var resp Response err = json.Unmarshal(output.Body, &resp) image := resp.Artifacts[0].Base64 return events.APIGatewayV2HTTPResponse{ StatusCode: http.StatusOK, Body: image, IsBase64Encoded: false, Headers: map[string]string{ "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST,OPTIONS", }, }, nil}//request/response modeltype Request struct { TextPrompts []TextPrompt `json:"text_prompts"` CfgScale float64 `json:"cfg_scale"` Steps int `json:"steps"` Seed int `json:"seed"`}type TextPrompt struct { Text string `json:"text"`}type Response struct { Result string `json:"result"` Artifacts []Artifact `json:"artifacts"`}type Artifact struct { Base64 string `json:"base64"` FinishReason string `json:"finishReason"`}
結論
このチュートリアルでは、AWS CDK を使用して、Amazon Bedrock と AWS Lambda を使用したサーバーレスイメージ生成ソリューションをデプロイし、CloudFront ドメイン経由の S3 上の静的ウェブサイトからアクセスされました。
AWS Go SDK と Amazon Bedrock Foundation Models (FMs) の使用に関する入門ガイドに興味がある場合は、このブログ投稿をご覧ください。
楽しい構築を!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles