
Serverless云原生DevOpsCLI【免费下载链接】upDeploy infinitely scalable serverless apps, apis, and sites in seconds to AWS.项目地址https://gitcode.com/gh_mirrors/up/up点击查看免费下载本文基于开源 Serverless 部署工具 Up 的官方指南编写围绕其开发 → 生产完整工作流展开如何订阅 Up Pro 并与团队成员协作、如何为应用购买并绑定自定义域名含外部注册商与第三方 DNS 两种映射方式、如何从 CI 一键部署以及如何利用 Up 的日志查询语言对结构化日志进行精确检索。读完本文你将掌握 Up 团队/域名/阶段Stage/Stack/日志这一整套生产级操作技能并能结合仓库源码理解每条命令背后的底层实现。一、订阅 Up Pro团队、计划与计费管理1.1 登录平台Up Pro 在开源版本基础上提供了加密环境变量、告警alerting等额外能力。要使用这些能力第一步是登录平台up team login会通过邮箱确认完成身份验证$ up team login email: tjapex.sh ⠋ verify: Check your email for a confirmation link点击邮件中的确认链接即完成登录。如果你通过一个或多个组织使用 Up Pro建议先创建团队team以便独立管理成员与订阅个人使用可以跳过这一步$ up team add My Company从源码实现看up team add会先校验本地配置是否已认证再将团队名转为蛇形snake_caseID创建团队后自动登录并轮询获取访问令牌最后把新团队设为当前活动团队见 internal/cli/team/team.go。也就是说添加团队后无需手动切换即可开始使用。1.2 订阅计划接下来执行订阅命令交互式流程会依次询问可选优惠券coupon、信用卡信息——卡号经由 HTTPS 直接传输给 Stripe绝不会经过 Up 的服务器——以及最终的订阅确认$ up team subscribe源码中可以看到该流程的完整实现先选择按月付费$20.00 USD/月或按年付费$216.00 USD/年相当于 10% 折扣的计费周期再输入可选优惠券无效券会提示 Coupon is invalid然后通过 Stripe 创建卡令牌stripe.TokenParams最后确认订阅见 internal/cli/team/team.go。订阅完成后你和团队成员即可将开源发行版升级为最新版 Up Pro$ up upgrade1.3 查看账户状态与切换团队任何时候都可以用以下命令查看账户状态$ up team team: apex subscription: Up Pro amount: $10.00 USD per month created: December 22, 2017注意up team实际执行的是默认子命令team status见 internal/cli/team/team.go。输出会包含卡品牌与卡号后四位、订阅金额若使用了优惠券则显示折后价、所有者与订阅创建时间若订阅已取消还会显示取消时间。切换到其他团队$ up team switch ❯ apex tjapex.shup team switch是一个交互式选择器从本地配置中列出所有团队并让你选择新的活动团队见 internal/cli/team/team.go。1.4 邀请团队成员使用以下命令邀请成员加入团队$ up team members add tobiapex.sh $ up team members add lokiapex.sh $ up team members add janeapex.sh随时可以查看成员与待处理邀请$ up team members team: apex Members • tjapex.sh • tobiapex.sh • lokiapex.sh Invites • janeapex.sh源码中members是up team members的默认子命令ls/list会分别列出Members与Invites两组邮箱见 internal/cli/team/team.go。团队成员会收到包含安装说明的邮件然后带上团队 ID 登录$ up team login --email tobiapex.sh --team apexup team login同时支持--email与--team两个标志当两者都指定时会完全忽略当前活动团队、使用这些凭据直接登录见 internal/cli/team/team.go。二、从开发到生产的完整工作流本节将以一个小型应用为例完整走一遍部署 → 购买域名 → 部署到多阶段 → 映射自定义域名的流程。2.1 首次部署在一个空目录中创建app.js。注意应用必须监听PORT环境变量指定的端口该变量由 Up 注入const http require(http) const { PORT 3000 } process.env http.createServer((req, res) { res.end(Hello World\n) }).listen(PORT)从源码看无论是云端 Lambda 环境还是本地up start/relay 代理Up 都会注入PORT云端在 platform/lambda/lambda.go 中把UP_STAGE、UP_COMMIT、UP_AUTHOR写入 Lambda 环境变量同时PORT会通过 internal/shim/index.js 等运行时机制传递本地代理则在启动子进程时显式设置PORT见 http/relay/relay.go。接下来为应用命名并开始配置。profile名称应与~/.aws/credentials中的配置名一致这样 Up 才能知道部署到哪个 AWS 账户、使用哪组凭据{ name: up-example, profile: up-tobi }运行up部署应用$ up build: 5 files, 3.9 MB (358ms) deploy: complete (14.376s) stack: complete (1m12.086s)up是默认命令等价于up deploy staging见 internal/cli/deploy/deploy.go。部署时 Up 还会自动收集 git 提交信息commit、author写入 Lambda 环境变量方便在日志中追踪版本见 internal/cli/deploy/deploy.go。用curl验证一切正常$ curl up url Hello Worldup url默认显示 staging 阶段的端点还支持-o浏览器打开、-c复制到剪贴板和-s stage指定阶段等标志见 internal/cli/url/url.go。2.2 购买域名域名可以从已有服务映射也可以直接通过 AWS Route53 购买。先检查域名是否可用$ up domains check up.com Domain up.com is unavailable Suggestions: theupwards.com $12.00 USD upwardonline.com $12.00 USD myupwards.com $12.00 USD theastir.com $12.00 USD astironline.com $12.00 USD myastir.com $12.00 USD myupward.net $11.00 USD cleanup.tv $32.00 USD myup.tv $32.00 USD itup.tv $32.00 USD newup.tv $32.00 USD thedown.net $11.00 USD theupward.net $11.00 USD upwardsonline.net $11.00 USD换个域名试试$ up domains check up-example.com Domain up-example.com is available for $12.00 USD购买并填写注册商所需的信息$ up domains buy Domain: up-example.com First name: TJ Last name: Holowaychuk Email: tjapex.sh Phone: 1.2501007000 Country code: CA City: Victoria State or province: BC Zip code: X9X 9X9 Address: Some address here源码显示up domains buy会通过交互式表单收集注册人信息并做本地校验邮箱必须包含与域名、国家代码必须是两位大写字母如CA、AU、电话必须以开头并带国家码见 internal/cli/domains/domains.go。购买操作最终调用 Route53 Domains 的RegisterDomain自动开启AutoRenew、按 1 年时长注册并把同一组联系人信息用于注册人/管理/技术三类联系人见 platform/aws/domains/domains.go。AWS 完成购买可能需要几分钟之后你会收到确认邮件并能在up domains输出中看到域名及其自动续费时间$ up domains gh-polls.com renews Aug 28 17:17:58 up-example.com renews Sep 19 19:40:50默认情况下通过 Up 购买的域名启用了隐私保护privacy protection即对 WHOIS 隐藏你的联系信息。列出时若域名开启了自动续费显示 renews否则显示 expires见 internal/cli/domains/domains.go。2.3 部署到多个阶段Stages在部署到 staging 和 production 之前先给应用加上UP_STAGE环境变量const http require(http) const { PORT 3000, UP_STAGE } process.env http.createServer((req, res) { res.end(Hello World from UP_STAGE) }).listen(PORT)分别部署到 staging 和 production。注意up是up deploy staging的别名$ up $ up deploy production在浏览器中打开两者$ up url -o $ up url -s production -o你应该看到 Hello World from production 和 Hello World from staging。阶段机制说明Up 默认内置development、staging、production三个阶段见 config/stages.go其中 development 是本地阶段IsLocalstaging/production 是远端阶段IsRemote。UP_STAGE由 Lambda 环境变量注入值即为当前部署阶段见 platform/lambda/lambda.go。2.4 将自定义域名映射到阶段部署完成后可以用stages和domain两个配置属性把自定义域名映射到各阶段。下面配置让 Up 知道production 使用up-example.comstaging 使用stage.up-example.com{ name: up-example, profile: up-tobi, stages: { staging: { domain: stage.up-example.com }, production: { domain: up-example.com } } }注意staging 也可以映射到staging-myapp.com这样的独立域名不一定是生产域名的子域名。配置完成后运行up stack plan预览资源变更它会提示你验证 AWS 发送的 Lets Encrypt 证书确认邮件$ up stack plan domains: Check your email for certificate approval ⠧ confirm: up-example.comAWS 要求通过邮箱验证来证明你对域名的所有权。AWS 会向注册域名时 WHOIS 中登记的 3 个联系人地址发信同时也会发送到域名的以下 5 个常见系统地址administratoryour_domain_namehostmasteryour_domain_namepostmasteryour_domain_namewebmasteryour_domain_nameadminyour_domain_name在任一邮件中点击 I Approve 后输出会继续并显示 Up 将要创建的新资源Add AWS::ApiGateway::DomainName id: ApiDomainDevelopment Add AWS::ApiGateway::BasePathMapping id: ApiDomainDevelopmentPathMapping Add AWS::ApiGateway::DomainName id: ApiDomainProduction Add AWS::ApiGateway::BasePathMapping id: ApiDomainProductionPathMapping Add AWS::Route53::RecordSet id: DnsZoneDevUpExampleComRecordDevUpExampleCom Add AWS::Route53::RecordSet id: DnsZoneUpExampleComRecordUpExampleCom一旦 Up 知道你要映射域名它会自动创建为你的域名注册免费的 ACM SSL 证书为 API Gateway 创建 CloudFront 分发API Gateway 的阶段映射stage mapping指向 CloudFront 分发的 Route53 DNS 区域与记录现在应用这些变更$ up stack apply变更应用后CloudFront 向全球分发配置和 SSL 证书大约需要10–40 分钟在此之前up-example.com暂时无法访问。一旦可用https://up-example.com将始终指向up deploy production部署的最新版本https://stage.up-example.com/将始终指向upstaging部署的最新版本Stack 概念Stack 是应用关联的所有资源的总称由 Up 在首次部署时创建。计划变更用up stack plan执行变更用up stack apply见 internal/cli/stack/stack.go。注意up stack plan要求应用已存在否则会提示先运行$ up创建应用。2.5 从外部注册商映射域名如果你通过up domains buy购买域名可以跳过本节但如果你用的是 Godaddy 等外部注册商则需要将 DNS 管理委托给 AWS。具体做法登录注册商网站配置 nameserver。要确定 nameserver 的值运行up stack它会输出应用 apex顶级域的 NS 记录$ up stack Staging domain: stage.up-example.com endpoint: d2od0udp1p8bru.cloudfront.net Production domain: up-example.com endpoint: d72wsqljqg5cy.cloudfront.net nameservers: • ns-1495.awsdns-58.org • ns-103.awsdns-12.com • ns-1670.awsdns-16.co.uk • ns-659.awsdns-18.net把这四个值保存到注册商的界面中即可。注意 DNS 记录变更需要一定时间才能传播生效。2.6 使用第三方 DNS 映射如果你用 Cloudflare 等第三方管理 DNS、只想用 Up 做部署则需要手动编辑或添加 DNS 记录。例如顶级域名sloths.com由 Cloudflare 管理你想把api.sloths.com指向应用应先在up.json中添加{ name: sloths, stages: { production: { domain: api.sloths.com } } }接下来需要执行up stack plan和up stack apply这会为应用设置一个 CloudFront 端点。用up stack查看端点信息$ up stack Production domain: api.sloths.com endpoint: d72wsqljqg5cy.cloudfront.net然后在你使用的 DNS 提供商这里是 Cloudflare中创建一条指向 productionendpoint的CNAME记录。务必确保你使用的domain与 Cloudflare 中的域名一致。2.7 Stack 变更为 staging 添加域名假设你想为 staging 阶段映射域名先在up.json中添加{ name: up-example, profile: up-tobi, stages: { staging: { domain: stage.up-example.com }, production: { domain: up-example.com } } }然后运行$ up stack plan检查输出——这种情况应该全是 Add 操作——然后应用$ up stack apply每当你修改stages/domain等配置后都可以用up stack plan预览、up stack apply执行。up stackstatus则用于查看资源状态与潜在错误。整个 stack 子命令族plan/apply/delete/status见 internal/cli/stack/stack.go。2.8 删除应用完成后想移除所有资源和应用本身只需运行$ up stack delete该命令会弹出确认提示 Really destroy stack ...?--force跳过确认、--async异步执行删除不等待完成可组合为-fa见 internal/cli/stack/stack.go。三、从持续集成CI部署应用得益于 Go 编译的单二进制分发Up 可以在 Travis、Circle、Semaphore 等任意 CI 提供方中几秒内完成安装并部署应用。3.1 环境变量第一步是配置环境变量以便 CI 访问你的 AWS 账户。这些值可以从cat ~/.aws/credentials获取AWS_ACCESS_KEY_ID– AWS access keyAWS_SECRET_ACCESS_KEY– AWS secret key如果使用 Up Pro还需要 Up 凭据才能通过up upgrade访问 Up Pro。运行up team ci或up team ci --copy直接复制到剪贴板获取然后把输出粘贴为环境变量的值UP_CONFIG– 以 base64 编码 JSON 形式存在的 Up 配置源码中up team ci会把当前 userconfig包含团队、令牌、邮箱序列化后用 base64 编码输出--copy标志则直接写入剪贴板见 internal/cli/team/team.go。如果遇到 403 Forbidden 错误这通常是 GitHub 对未认证用户限流导致的可以创建 Personal Access Token 并添加以下变量GITHUB_TOKEN— GitHub personal access token3.2 命令在 CI 中把 Up 安装到当前工作目录并部署到生产环境非 Up Pro 订阅者可省略up upgrade$ curl -sf https://up.apex.sh/install | BINDIR. sh $ ./up upgrade $ ./up production或者选择全局安装到PATH$ sudo chown -R $(whoami) /usr/local/bin $ curl -sf https://up.apex.sh/install | sh $ up upgrade $ up production注意up production之所以有效是因为deploy是默认命令up stage等价于up deploy stage见 internal/cli/deploy/deploy.go 与 docs/06-commands.md。若 CI 中已有独立构建步骤还可使用up deploy --no-build跳过构建 hooks。四、掌握日志让应用输出被 Up 识别本节介绍如何从应用输出 Up 能识别的日志。Up 未来将支持把日志转发到 Loggly、Papertrail 或 ELK 等服务。4.1 纯文本日志第一种方式是向 stdout/stderr 输出纯文本日志。目前stderr 的写入视为 ERROR 级日志stdout 视为 INFO。这一映射在源码中有明确实现relay 代理用两个 writer 分别捕获子进程 stdoutINFO与 stderrERROR并按行解析写入日志流见 internal/logs/writer/writer.go。用 Node.js 写纯文本日志非常简单console.log(User signed in) console.error(Failed to sign in: %s, err)将被收集为INFO: User signed in ERROR: Failed to sign in: something broke4.2 JSON 结构化日志第二种方式是使用 JSON 事件的结构化日志这是推荐做法因为你可以针对特定字段进行查询、把日志当作事件处理。JSON 日志需要包含level和message两个字段console.log({ level: info, message: User login })将被收集为INFO: User loginmessage字段通常不应包含动态内容如用户名、邮箱这些应作为字段提供console.log({ level: info, message: User login, fields: { name: Tobi, email: tobiapex.sh } })将被收集为INFO: User login nameTobi emailtobiapex.sh这允许你执行类似查询$ up logs message User login name Tobi或者$ up logs name Tobi or email tobi*下面是一个简单的 JavaScript logger 供参考——你只需要向 stdout 输出一些 JSON剩下的交给 Upfunction log(level, message, fields {}) { const entry { level, message, fields } console.log(JSON.stringify(entry)) }例如 Go 语言的 apex/log 包使用jsonhandler 就会输出这种格式。结构化日志的底层解析Up 会先判断一行是否 JSONutil.IsJSONLog是则解析为log.Entry按level字段分发到 Debug/Info/Warn/Error 等日志级别并附带fields不是 JSON 则按纯文本输出见 internal/logs/writer/writer.go。五、日志查询语言Up 支持一套完整的查询语言可对结构化数据执行复杂过滤支持运算符、等值、子串匹配等。查询工具本身通过up logs命令提供常用标志包括-f/--follow实时跟踪、-S/--since时间范围默认1d支持30s、5m、2h、1h30m、3d、1M、-e/--expand展开字段见 internal/cli/logs/logs.go。本仓库的查询语言由 internal/logs/parser 下的 PEG 语法与 AST 实现internal/logs/parser/ast/ast.go。5.1 AND 运算符and运算符是隐式的可以完全不写因为它是最常见的情况。假设要显示来自指定 IP 地址的生产环境错误日志production error ip 207.194.32.30解析器会自动注入and等价于编译成production and error and ip 207.194.38.505.2 OR 运算符当然也有or运算符例如显示警告或错误production (warn or error)这些表达式还可以按需嵌套(production or staging) (warn or error) method GET5.3 等值运算符和!等值运算符允许你按字段内容过滤。用只显示 GET 请求method GET或用!显示除 GET 之外的所有请求method ! GET5.4 关系运算符、、、关系运算符适合比较数值例如响应状态码status 200 status 3005.5 阶段Stages过滤目前 development、staging、production 的所有日志都存储在同一个位置但你可以通过过滤找到所需内容。关键字production、staging、development会展开为stage production例如过滤生产环境的慢响应production duration 1s等同于stage production duration 1s5.6 严重级别Severity levelsUp 提供请求级日志并自动应用严重级别5xx 响应是 ERROR4xx 是 WARN3xx 或 2xx 是 INFO。因此与其用下面这种方式显示生产错误production status 500你可以直接使用production error5.7 IN 运算符in运算符检查字段是否存在于给定集合中。例如只显示 POST、PUT 和 PATCH 请求method in (POST, PUT, PATCH)从源码看in在 AST 中会被展开为多个等值判断的||或组合见 internal/logs/parser/ast/ast.go因此语义上等价于method POST || method PUT || method PATCH。5.8 单位Units日志语法支持字节与时长单位。例如显示大于 56kb 的响应size 56kb或显示超过 1500ms 的响应duration 1.5s字节单位b字节123b与123等价kb千字节5kb、128kbmb兆字节5mb、15.5mb时长单位ms毫秒100ms与100等价s秒1.5s、5sAST 中的Number节点会按单位换算kb× 2^10、mb× 2^20、s× 1000 等换算后统一处理见 internal/logs/parser/ast/ast.go。5.9 子串匹配对字符串如日志消息过滤时可以使用*字符进行子串匹配。例如显示远端 IP 以207.开头的日志ip 207.*或包含单词 login 的消息message *login*针对这种场景还有一个专门的关键字message contains logincontains关键字在 AST 中被表示为Contains节点等价于在字符串两端加上*见 internal/logs/parser/ast/ast.go即message *login*。5.10 更多实战示例结合 docs/06-commands.md 中的命令参考up logs的完整能力还包括实时跟踪up logs -f只看生产环境实时日志up logs -f production只看生产环境实时错误日志up logs -f production error错误与警告含 4xx 和 5xxup logs warn or error按消息与 HTTP 方法组合过滤up logs message user login method GET200 响应且延迟超过 1500msup logs status 200 duration 1.5s请求体大于 100kbup logs size 100kb邮箱包含apex.shup logs user.email contains apex.sh复杂组合查询up logs method in (POST, PUT) ip 207.* status 200 duration 50非终端环境下输出 JSON便于配合jq等工具处理up logs error | jq六、开发环境热重载up start命令默认使用proxy.command该命令会根据应用类型自动推断例如 Node.js 是node app.js、Golang 是./server。你可以通过 development 阶段的环境配置来修改up start使用的命令。例如 Golang 项目想用go run main.go或者使用 gin 做热重载{ name: app, stages: { development: { proxy: { command: gin --port $PORT } } } }注意服务器必须始终监听PORT该端口由up start提供。实现细节up start会先加载配置、设置环境变量然后应用 development 阶段覆盖c.Override(stage)最后用与生产相同的 handler 链在本地localhost:3000启动开发服务器默认地址可用--address修改-o自动打开浏览器-c可临时覆盖代理命令见 internal/cli/start/start.go。proxy配置还支持timeout默认 15s与listen_timeout默认 15s需 ≤25s等参数见 config/relay.go。七、访问 Lambda 上下文传统 AWS Lambda 函数提供 context 对象包含 API Gateway 用户身份等运行时信息。在 Up 中这些信息以 JSON 形式暴露在X-Context请求头中const http require(http) const { PORT } process.env const app http.createServer((req, res) { const ctx JSON.parse(req.headers[x-context]) res.end(JSON.stringify(ctx, null, 2)) }) console.log(Starting app on %s, PORT) app.listen(PORT)实现原理在 internal/proxy/request.go 中Up 将 API Gateway 的RequestContext含 requestId、stage、identity 等信息序列化后写入X-Context请求头同时还会注入X-Request-Id请求 ID与X-Stage阶段名两个请求头。输出与下面类似{ apiId: g4yn392afg, resourceId: ez0z8areob, requestId: d8314ef1-5543-11e8-a925-21fa0dd01c37, accountId: 337344593553, stage: staging, identity: { apiKey: , accountId: , userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36, sourceIp: 64.110.31.100, accessKey: , caller: , user: , userARN: , cognitoIdentityId: , cognitoIdentityPoolId: , cognitoAuthenticationType: , cognitoAuthenticationProvider: }, authorizer: null }其中identity对象提供了sourceIp客户端来源 IP、userAgent等信息若配置了自定义授权器authorizer字段会包含对应数据。八、命令速查与延伸阅读本文涉及的命令汇总命令作用up team login登录/注册账户可用--email、--team指定团队up team add Name创建团队并切换为活动团队up team subscribe订阅 Up Pro 计划up team/up team status查看账户与订阅状态up team switch交互式切换活动团队up team members add email邀请团队成员up team members列出成员与邀请up team ci [--copy]输出 CI 所需 base64 凭据up/up deploy [stage]部署默认 stagingup url [-o/-c] [-s stage]显示/打开/复制阶段端点up domains check domain查询域名可用性含建议up domains buy通过 Route53 购买域名up domains列出已购域名及续费时间up stack plan/up stack apply预览/应用 Stack 资源变更up stack/up stack status查看资源状态与 NS 记录up stack delete删除应用全部资源-f强制、-a异步up start [-o] [--address :5000] [-c cmd]启动本地开发服务器up logs [query] [-f] [-S 1d] [-e]查询/跟踪日志若需深入了解命令的完整用法与输出格式可参阅仓库中的 docs/06-commands.md配置项stages、proxy、profile、name等的完整说明见 docs/04-configuration.md安装方式见 docs/01-installation.mdAWS 凭据准备见 docs/02-aws-credentials.md。总结至此你已经走通了 Up 的完整生产工作流从订阅 Up Pro 并管理团队成员到用up.json配置多阶段应用、通过 Route53 购买域名并映射自定义域名无论域名在 AWS 内部还是外部注册商、第三方 DNS再到从 CI 一键部署、用结构化日志配合查询语言精确检索问题最后通过up start本地热重载与X-Context头访问 Lambda 运行时上下文。结合本文引用的 internal/cli、platform/aws/domains、internal/logs、internal/proxy 等源码路径你可以随时深入验证每个行为背后的具体实现。赞分享Serverless云原生DevOpsCLI【免费下载链接】upDeploy infinitely scalable serverless apps, apis, and sites in seconds to AWS.项目地址https://gitcode.com/gh_mirrors/up/up点击查看免费下载相关推荐Up CLI 命令完全指南用 up 命令完成部署、日志、指标与团队管理Up CLI 命令完全指南用 up 命令完成部署、日志、指标与团队管理 Up 是面向 AWS Lambda 与 API Gateway 的 serverlesServerless云原生DevOpsCLIWhiteSur macOS 风格 Gnome 主题完整指南安装、定制与兼容性修复一次讲清WhiteSur macOS 风格 Gnome 主题完整指南安装、定制与兼容性修复一次讲清 WhiteSur gtk theme 是一款把 Gnome 桌面变UI组件设计系统洛雪音乐音源终极指南一键解锁全网无损音乐资源洛雪音乐音源终极指南一键解锁全网无损音乐资源 想要免费收听全网音乐厌倦了在多个音乐平台之间切换洛雪音乐音源项目为你提供了完整的解决方案这个开源项目汇集了音视频上一篇MarkText 的 Linux 安装指南AppImage、桌面集成、二进制包与 AUR 全攻略下一篇终极轻量级内存优化工具Mem Reduct深度解析与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考