AWS SST
使用 Serverless Stack (SST) 和基础设施即代码将 NEXTDEVKIT 部署到 AWS
使用 Serverless Stack (SST) 将您的 NEXTDEVKIT 应用程序部署到 AWS,以获得企业级基础设施和完全控制及可扩展性。
🌟 为什么选择 AWS SST?
AWS SST 适用于需要以下功能的企业应用程序:
- 🏗️ 基础设施即代码:版本控制、可重复的部署
- 🎭 多环境:隔离的预发布和生产环境
- 🔧 完整 AWS 集成:访问所有 AWS 服务和无限可扩展性
- 🛡️ 类型安全:TypeScript 基础设施减少配置错误
- 💰 成本优化:仅为使用的内容付费,无服务器定价
- 🔐 企业安全:AWS 安全最佳实践和合规就绪
📋 先决条件
在部署之前,确保您拥有:
🚀 部署步骤
第 1 步:配置环境变量
请参考环境指南了解详细的环境变量。
复制 .env.example
到 .env.production
并更新环境变量。
第 2 步:配置 AWS 凭据
设置您的 AWS 凭据:
# 配置 AWS CLI
aws configure
# AWS Access Key ID: your-access-key-id
# AWS Secret Access Key: your-secret-access-key
# Default region name: us-east-1
# Default output format: json
或编辑 ~/.aws/credentials
文件:
[default]
aws_access_key_id = your-access-key-id
aws_secret_access_key = your-secret-access-key
请确认 AWS 凭据 IAM 权限正确。您可以参考 SST AWS IAM 凭据来检查 IAM 权限。
第 3 步:初始化 SST 项目
更新项目根目录中的 sst.config.ts
文件:
export default $config({
app(input) {
return {
name: "nextdevkit-aws-template",
removal: input?.stage === "production" ? "retain" : "remove",
protect: ["production"].includes(input?.stage),
home: "aws",
providers: {
cloudflare: "6.3.1",
aws: { version: "6.83.0", region: "us-east-1" },
},
};
},
async run() {
const vpc = new sst.aws.Vpc("YourVpcName", {
/// ...
});
const database = new sst.aws.Postgres("YourDatabaseName", {
/// ...
});
const bucket = new sst.aws.Bucket(
"YourBucketName",
{
/// ...
}
);
const migrator = new sst.aws.Function("YourMigratorName", {
handler: "src/database/migrator.handler",
link: [database],
vpc,
/// ...
});
if (!$dev) {
new aws.lambda.Invocation("DatabaseMigratorInvocation", {
input: Date.now().toString(),
functionName: migrator.name,
});
}
new sst.aws.Nextjs("YourNextjsSiteName", {
link: [database, bucket],
vpc,
domain: {
name: "your-domain.com",
dns: sst.cloudflare.dns({
proxy: true,
}),
},
environment: {
NEXT_PUBLIC_AVATARS_BUCKET_NAME: bucket.name,
},
});
new sst.x.DevCommand("DrizzleStudio", {
link: [database],
dev: {
command: "npx drizzle-kit studio",
},
});
},
});
如果您更改了数据库名称,需要更新 drizzle.config.ts
文件和 src/database/client
文件资源名称。
如果您不想使用 cloudflare dns,可以删除 domain.dns
属性。您可以参考 SST AWS DNS 了解更多关于 dns 的信息。
第 4 步:配置数据库
如果使用 AWS RDS 作为您的数据库,您可以参考数据库指南了解更多关于数据库设置的信息。
更新 sst.config.ts
文件以包含 RDS 配置。
# 将数据库密码设置为密钥
npx sst secret set NextDevKitDBPassword your-secure-password
如果您想更改密钥名称,需要在 database
属性中更新 sst.config.ts
文件。
更新您的 sst.config.ts
以包含 RDS 配置:
// 添加到您的 sst.config.ts
const database = new sst.aws.Postgres("NextDevKitDB", {
instance: "t4g.micro",
storage: "20 GB",
version: "16.4",
vpc,
proxy: true,
// 在此设置您的密钥名称
password: new sst.Secret("NextDevKitDBPassword").value,
});
第 5 步:设置生产密钥
如果您想使用 SST 配置生产密钥,可以在 sst.config.ts
文件中设置密钥。
# 设置生产环境变量
npx sst secret set BETTER_AUTH_SECRET your-32-character-secret-key
npx sst secret set RESEND_API_KEY re_your_resend_api_key
npx sst secret set STRIPE_SECRET_KEY sk_live_your_stripe_secret_key
npx sst secret set GITHUB_CLIENT_SECRET your-github-client-secret
npx sst secret set GOOGLE_CLIENT_SECRET your-google-client-secret
new sst.aws.Nextjs("NextDevKitWeb", {
link: [database, bucket],
vpc,
domain: {
name: "aws.nextdevkit.com",
dns: sst.cloudflare.dns({
proxy: true,
}),
},
environment: {
NEXT_PUBLIC_AVATARS_BUCKET_NAME: bucket.name,
// 在此设置您的密钥环境变量
BETTER_AUTH_SECRET: $dev ? process.env.BETTER_AUTH_SECRET : new sst.Secret("BETTER_AUTH_SECRET").value,
RESEND_API_KEY: $dev ? process.env.RESEND_API_KEY : new sst.Secret("RESEND_API_KEY").value,
STRIPE_SECRET_KEY: $dev ? process.env.STRIPE_SECRET_KEY : new sst.Secret("STRIPE_SECRET_KEY").value,
GITHUB_CLIENT_SECRET: $dev ? process.env.GITHUB_CLIENT_SECRET : new sst.Secret("GITHUB_CLIENT_SECRET").value,
GOOGLE_CLIENT_SECRET: $dev ? process.env.GOOGLE_CLIENT_SECRET : new sst.Secret("GOOGLE_CLIENT_SECRET").value,
},
});
第 6 步:部署到 AWS
# 部署到开发环境
npx sst dev
# 部署到生产环境
npx sst deploy --stage production
第 7 步:数据库迁移
部署后运行数据库迁移:
# 生成迁移文件
pnpm run db:generate
迁移在部署期间自动应用
if (!$dev) {
new aws.lambda.Invocation("DatabaseMigratorInvocation", {
input: Date.now().toString(),
functionName: migrator.name,
});
}
SST 配置在部署期间使用 Lambda 函数自动处理数据库迁移。
第 8 步:更改为 ECS 部署
要在容器中部署我们的 Next.js 应用,我们将使用 AWS Fargate 和 Amazon ECS。替换您的 sst.config.ts 中的 run 函数。
async run() {
const vpc = new sst.aws.Vpc("MyVpc");
const cluster = new sst.aws.Cluster("MyCluster", { vpc });
new sst.aws.Service("MyService", {
cluster,
loadBalancer: {
ports: [{ listen: "80/http", forward: "3000/http" }],
},
dev: {
command: "npm run dev",
},
});
}
有关 ECS 部署的更多信息,您可以参考 SST AWS ECS 了解更多关于 ECS 部署的信息。
🎉 下一步
现在您的 NEXTDEVKIT 已部署在 AWS 上,您可以:
- 🔧 配置监控:设置 CloudWatch 警报和仪表板
- 🔐 安全审查:审核 IAM 权限和安全组
- 📊 性能:监控 Lambda 指标并优化
- 💰 成本管理:设置计费警报和成本跟踪
- 🚀 扩展:添加更多区域并优化增长
其他资源
您的 NEXTDEVKIT 应用程序现在运行在企业级 AWS 基础设施上!🌟🚀