使用 Amazon Bedrock Stability 生成图片并通过 API 提供服务

使用 Amazon Bedrock Stability 生成图片并通过 API 提供服务

van 知其变,守其恒,为天下式.

Amazon Bedrock 可以画图,我正好需要在网站上调用他来画图,所以就尝试在VPS上搭建了一个代理,提供API和KEY,输入prompt,将图片保存在VPS上,并返回图片的url。我用的就是GCP 300那个免费的美国VPS。

这里将介绍如何使用 Amazon Bedrock 的Stability生成图片,并通过 API 提供服务。下面是我的操作步骤,应该还可以优化和简化,我的步骤包括:

  1. 申请访问 Amazon Bedrock 基础模型
  2. 配置 AWS IAM 权限
  3. 搭建 Flask API 服务
  4. 使用 systemd 管理服务和 Nginx 反向代理
  5. 测试 API

1. 申请访问 Amazon Bedrock 基础模型

首先,你需要申请访问 Amazon Bedrock 的基础模型。你可以在 AWS 管理控制台中找到与 Bedrock 相关的服务。确保你选择了适合你需求的区域,例如支持 Stability AI 的区域。

2. 配置 AWS IAM 权限

在 AWS IAM 中创建一个策略,授予 InvokeModelListFoundationModels 操作权限,允许访问 Amazon Bedrock 服务。具体步骤如下:

  1. 登录 AWS 管理控制台。
  2. 打开 IAM 控制台,创建一个新的 IAM 策略。
  3. 在策略中,选择 Bedrock 服务,授予 InvokeModelListFoundationModels 操作权限。
  4. 配置资源 ARN(Resource ARN)为你需要访问的模型的 ARN,或选择任何资源。
  5. 将策略与 IAM 用户或角色关联。

3. 安装 AWS CLI 和 Boto3 SDK

在你的 VPS 上,你需要安装 AWS CLI 和 Boto3,以便与 Amazon Bedrock 交互。

安装 AWS CLI 教程:

1
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html

配置 AWS CLI:

1
aws configure

输入以下信息:

  • AWS Access Key ID:
  • AWS Secret Access Key:
  • Default region name: 选择你的区域,例如 us-east-1
  • Default output format: json

安装 Boto3 SDK:

1
pip install boto3

4. 搭建 Flask API 服务

我们使用 Flask 来创建一个 API 服务,用户可以通过 POST 请求生成图片,并返回图片的 URL。

以下是完整的 Flask 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from flask import Flask, request, jsonify, send_from_directory
from flask_cors import CORS
import base64
import boto3
import json
import os
from datetime import datetime

app = Flask(__name__)
CORS(app)

client = boto3.client("bedrock-runtime", region_name="us-east-1")
model_id = "stability.stable-diffusion-xl-v1"

output_dir = "/root/output"
if not os.path.exists(output_dir):
os.makedirs(output_dir)

# 配置API密钥
API_KEY = ""

def generate_image_from_bedrock(prompt):
native_request = {
"text_prompts": [{"text": prompt, "weight": 1}],
"cfg_scale": 10,
"steps": 50,
"seed": 0,
"width": 1024,
"height": 1024,
"samples": 1
}

try:
response = client.invoke_model(
modelId=model_id,
body=json.dumps(native_request)
)
model_response = json.loads(response["body"].read())
base64_image_data = model_response["artifacts"][0]["base64"]
return base64_image_data
except Exception as e:
raise Exception(f"Error invoking Bedrock model: {str(e)}")

def verify_api_key(api_key):
if api_key != API_KEY:
raise PermissionError("Invalid API Key. Access Denied.")

def save_image_and_get_url(base64_image):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"image_{timestamp}.png"
filepath = os.path.join(output_dir, filename)

with open(filepath, "wb") as image_file:
image_file.write(base64.b64decode(base64_image))

return f"/images/{filename}"

@app.route('/generate-image', methods=['POST'])
def generate_image():
try:
data = request.json
prompt = data.get("prompt")
api_key = request.headers.get("Authorization")

if api_key is None:
return jsonify({"error": "API Key is required"}), 400

verify_api_key(api_key)

if not prompt:
return jsonify({"error": "Prompt is required"}), 400

base64_image = generate_image_from_bedrock(prompt)
image_url = save_image_and_get_url(base64_image)

return jsonify({"imageUrl": image_url}), 200

except PermissionError as e:
return jsonify({"error": str(e)}), 403
except KeyError as e:
return jsonify({"error": f"Missing key: {str(e)}"}), 400
except Exception as e:
return jsonify({"error": f"Internal Server Error: {str(e)}"}), 500

@app.route('/images/<path:filename>')
def serve_image(filename):
return send_from_directory(output_dir, filename)

if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=False)

代码说明

  • generate_image_from_bedrock:调用 Amazon Bedrock 生成图像。
  • verify_api_key:验证请求中的 API 密钥。
  • save_image_and_get_url:将生成的图像保存到本地,并返回图像的 URL。

5. 使用 systemd 和 Nginx 配置反向代理

为了将 API 服务以后台进程运行,并通过 HTTPS 访问,我们需要使用 systemd 和 Nginx 配置。

配置 systemd 服务

创建 systemd 服务文件:

1
sudo nano /etc/systemd/system/flaskapp.service

将以下内容粘贴到文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Flask web application for image generation
After=network.target

[Service]
ExecStart=/usr/bin/python3 /root/img-web.py
WorkingDirectory=/root
StandardOutput=journal
StandardError=journal
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

注意:

  • 我们将 ExecStart 设置为 /usr/bin/python3 /root/img-web.py,这里使用了你提供的 img-web.py 的路径。
  • WorkingDirectory 设置为 /root,因为你的脚本在 root 目录下。
  • UserGroup 都设置为 root,因为你是在 root 用户下操作的。

保存并关闭文件(在 nano 编辑器中,按 Ctrl+X,然后按 Y,最后按 Enter)。

重新加载 systemd 配置:

1
sudo systemctl daemon-reload

启用服务,使其在系统启动时自动启动:

1
sudo systemctl enable flaskapp.service

启动服务:

1
sudo systemctl start flaskapp.service

检查服务状态:

1
sudo systemctl status flaskapp.service

配置 Nginx 反向代理

参考我的这篇博客

1
https://xblog.aptzone.cc/2024/01/26/docker%E4%BB%A5%E5%8F%8Adocker-compose%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/

6. 测试 API

使用 curl 命令进行测试,发送 POST 请求并查看返回的图像 URL:

1
2
3
4
curl -X POST http://your-domain.com/generate-image \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "a futuristic city skyline at sunset"}'

如果一切顺利,返回的 JSON 会包含图片的 URL。


总结

通过本教程,你可以成功使用 Amazon Bedrock 创建图片,并通过 Flask API 提供服务。你还学会了如何使用 systemd 管理 Flask 服务,并通过 Nginx 配置反向代理,提供一个可以在线访问的 API。

  • Title: 使用 Amazon Bedrock Stability 生成图片并通过 API 提供服务
  • Author: van
  • Created at : 2024-11-17 12:49:11
  • Updated at : 2024-11-17 12:58:06
  • Link: https://xblog.aptzone.cc/2024/11/17/使用-Amazon-Bedrock-Stability-生成图片并通过-API-提供服务/
  • License: All Rights Reserved © van
Comments