Định giá của Google App Engine Linh hoạt env, một bài học $ 500


103

Tôi đã làm theo hướng dẫn về Nodejs trên App Engine Linh hoạt env @: https://cloud.google.com/nodejs/getting-started/hello-world

Sau khi triển khai và thử nghiệm thành công hướng dẫn, tôi đã thay đổi mã để thử nghiệm một chút và triển khai thành công ... và sau đó để nó chạy vì đây là môi trường thử nghiệm (không công khai).

Một tháng sau, tôi nhận được hóa đơn từ Google hơn $ 370!

Trong chi tiết giao dịch, tôi thấy như sau:

Ngày 1 - 31 tháng 10 năm 2017 RAM phiên bản App Engine Flex: 5948,774 Gibibyte-giờ ([MYPROJECT]) $ 42,24

Ngày 1 - 31 tháng 10 năm 2017 Số giờ chính của phiên bản linh hoạt của App Engine: 5948,774 giờ ([MYPROJECT]) $ 312,91

Làm thế nào mà môi trường thử nghiệm với gần như 0 yêu cầu này lại yêu cầu khoảng 6.000 giờ tài nguyên? Trong điều tồi tệ nhất, tôi sẽ giả sử 720 giờ chạy toàn thời gian trong một tháng @ 0,05 đô la mỗi giờ sẽ khiến tôi mất ~ 40 đô la. https://cloud.google.com/appengine/pricing

Ai đó có thể giúp làm sáng tỏ điều này? Tôi không thể tìm ra lý do tại sao lại cần nhiều tài nguyên như vậy?

Cảm ơn đã giúp đỡ!

Để biết thêm dữ liệu, đây là lưu lượng truy cập trong tháng trước (về cơ bản là 0): Dữ liệu lưu lượng truy cập

Và dữ liệu phiên bảnDữ liệu phiên bản

CẬP NHẬT: Lưu ý rằng tôi đã mang đến một sửa đổi cho package.json: Tôi đã thêm gật đầu làm phụ thuộc và thêm nó như một phần của tập lệnh "nmp start" của mình. Mặc dù tôi nghi ngờ điều này giải thích cho 6000 giờ tài nguyên:

  "scripts": {
    "deploy": "gcloud app deploy",
    "start": "nodemon app.js",
    "dev": "nodemon app js",
    "lint": "samples lint",
    "pretest": "npm run lint",
    "system-test": "samples test app",
    "test": "npm run system-test",
    "e2e-test": "samples test deploy"
  },

App.yaml (mặc định-không thay đổi so với hướng dẫn)

runtime: nodejs
env: flex

Bạn nên liên hệ với bộ phận hỗ trợ GCP để được trợ giúp về thanh toán: support.google.com/cloud/contact/cloud_platform_billing
BrettJ,

4
Cảm ơn phản hồi @BrettJ, tôi đã liên hệ với họ và đây là những gì họ nói với tôi: "Như đã đề cập, chúng tôi không có bất kỳ khả năng nào để xem báo cáo chi tiết về việc sử dụng, đó là lý do tại sao tôi cung cấp liên kết để bạn cũng có thể đăng trên diễn đàn cộng đồng và một lần nữa sẽ có các nhà phát triển có kinh nghiệm có thể giúp bạn giải đáp các thắc mắc kỹ thuật của bạn. "
ddallala

2
Kỳ vọng của bạn xuất hiện dựa trên định giá env tiêu chuẩn (và chỉ một phiên bản lớp B1). Nhưng bạn đang sử dụng flex env - định giá khác nhau. Kiểm tra app.yaml của bạn để biết cấu hình CPU và GB bộ nhớ - đó là những bộ nhân theo giờ mỗi phiên bản của bạn. Sau đó, bạn nhân với 2 - số phiên bản bạn đã chạy.
Dan Cornilescu

Xin chào @DanCornilescu, giá vẫn ở mức ~ 0,0,5 đô la ngay cả đối với các env linh hoạt ... vCPU mỗi giờ lõi 0,0526 đô la (Iowa). Tôi đã dán app.yaml của mình ... trong ngắn hạn, không sửa đổi nó từ hướng dẫn.
ddallala

1
OK, bây giờ bạn có điểm dữ liệu ban đầu để liên lạc với bộ phận hỗ trợ thanh toán GCP.
Dan Cornilescu

Câu trả lời:


175

Sau nhiều lần qua lại với Google và hàng giờ đọc blog và xem các báo cáo, cuối cùng (phần nào) tôi đã tìm ra lời giải thích cho những gì đã xảy ra. Tôi sẽ đăng nó ở đây với các đề xuất của tôi để những người khác cũng không trở thành nạn nhân của vấn đề này.

Lưu ý, điều này có vẻ hiển nhiên đối với một số người, nhưng là một người dùng GAE mới, tất cả những điều này đều hoàn toàn mới đối với tôi.

Tóm lại, khi triển khai tới GAE và sử dụng lệnh sau " $ gcloud app deploy ", nó sẽ tạo một phiên bản mới và đặt nó làm mặc định, nhưng cũng và quan trọng hơn, nó KHÔNG xóa phiên bản trước đó đã được triển khai.

Có thể tìm thấy thêm thông tin về các phiên bản và phiên bản tại đây: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine

Vì vậy, trong trường hợp của tôi, mà không biết điều đó, tôi đã tạo nhiều phiên bản ứng dụng nút đơn giản của mình. Các phiên bản này vẫn đang chạy trong trường hợp cần chuyển đổi sau một lỗi. Nhưng các phiên bản này cũng yêu cầu phiên bản và mặc định, trừ khi được nêu trong app.yaml, là 2 phiên bản.

Google nói:

Theo mặc định, App Engine chia tỷ lệ số lượng phiên bản đang chạy lên và xuống để phù hợp với tải, do đó cung cấp hiệu suất nhất quán cho ứng dụng của bạn mọi lúc trong khi giảm thiểu các phiên bản không hoạt động và do đó giảm chi phí.

Tuy nhiên, từ kinh nghiệm của tôi, đây không phải là trường hợp. Như tôi đã nói trước đó, tôi đã đẩy ứng dụng nút của mình bằng gật đầu mà có vẻ như nó đang gây ra lỗi.

Cuối cùng, làm theo hướng dẫn và không tắt dự án, tôi có 4 phiên bản, mỗi phiên bản có 2 phiên bản chạy toàn thời gian trong 1,5 tháng, phục vụ 0 yêu cầu và tạo ra nhiều thông báo lỗi và tôi phải trả 500 đô la.

KHUYẾN NGHỊ NẾU BẠN VẪN MUỐN SỬ DỤNG GAE FLEX ENV:

  1. Đầu tiên và quan trọng nhất, hãy thiết lập ngân sách thanh toán và cảnh báo để bạn không bị ngạc nhiên bởi một hóa đơn đắt tiền được tự động tính phí vào CC của bạn: https://cloud.google.com/billing/docs/how-to/budgets

  2. Trong một env thử nghiệm, rất có thể bạn không cần nhiều phiên bản, vì vậy trong khi triển khai, hãy sử dụng lệnh sau:
    $ gcloud app deploy --version v1

  3. Cập nhật app.yaml của bạn để buộc chỉ 1 phiên bản với tài nguyên tối thiểu:

runtime: nodejs
env: flex

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10
  1. Đặt giới hạn chi tiêu hàng ngày

nhập mô tả hình ảnh ở đây

Xem bài đăng trên blog này để biết thêm thông tin: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-enosystem-104fc6736495

Tôi ước một số bước này đã được đưa vào hướng dẫn để bảo vệ những người đang cố gắng tìm hiểu và thử nghiệm, nhưng không phải vậy.

Google App Engine Flex env có thể phức tạp nếu một người không biết tất cả những chi tiết này. Một người bạn đã chỉ tôi đến Heroku, nơi có cả giá cả và ưu đãi Miễn phí / Sở thích. Tôi đã có thể nhanh chóng đẩy một ứng dụng nút mới vào đó và nó hoạt động như một sự quyến rũ! https://www.heroku.com/pricing

Tôi "chỉ" mất 500 đô la để học bài học này, nhưng tôi hy vọng điều này sẽ giúp ích cho những người khác đang tìm hiểu về Google App Engine Flex Env.


60
Google thực sự dường như đã dồn thị trường vào những tài liệu tệ hại. Thật không may khi bạn bị tát với một tờ 500 đô la, nhưng bạn đã nhận được viên đạn cho nhiều người khác, tôi chắc chắn rằng bằng cách cung cấp những hiểu biết của bạn, rất được đánh giá cao!
Drazen Bjelovuk

10
một khả năng khác "triển khai ứng dụng gcloud app.yaml --stop-trước-phiên bản"
DeividasV

2
Cảm ơn, rất hữu ích. Cảnh báo / giới hạn thanh toán là phải. Đối mặt với một vấn đề tương tự chỉ thời gian gần đây
Kartik

1
đây chắc chắn không phải là cách rẻ nhất, vì nó sẽ liên tục chạy một phiên bản duy nhất. vui lòng xem câu trả lời của tôi
Caner

Chúng ta có thể mong đợi điều bất ngờ tồi tệ tương tự với env tiêu chuẩn của AppEngine không? Hay các vấn đề OP đề cập chỉ xảy ra trong flex env?
John Doe

17

Nếu bạn muốn giảm chi phí GAE của mình, vui lòng KHÔNG sử dụng manual_scalingtheo đề xuất trong bài viết này hoặc câu trả lời được chấp nhận!

Điều tuyệt vời về Google App Engine là nó có thể mở rộng quy mô lên đến hàng trăm máy trong vòng mili giây dựa trên nhu cầu. Và bạn chỉ trả tiền cho các phiên bản đang chạy.

Để có thể tối ưu hóa chi phí của mình, bạn cần hiểu các tùy chọn mở rộng quy mô khác nhau và các loại phiên bản:

1. Công cụ ứng dụng flex so với tiêu chuẩn:

Bạn có thể tìm thấy chi tiết về sự khác biệt ở đây , nhưng một điểm khác biệt quan trọng liên quan đến câu hỏi này là:

[Tiêu chuẩn là] Dự định chạy miễn phí hoặc với chi phí rất thấp, nơi bạn chỉ trả tiền cho những gì bạn cần và khi bạn cần. Ví dụ: ứng dụng của bạn có thể mở rộng thành 0 phiên bản khi không có lưu lượng truy cập.

2. Tùy chọn tỷ lệ:

  • Tự động mở rộng quy mô: Google sẽ mở rộng ứng dụng của bạn tùy thuộc vào nhu cầu và cấu hình bạn đã cung cấp.
  • Chia tỷ lệ thủ công: Hoàn toàn không chia tỷ lệ, GAE sẽ chạy chính xác # trường hợp bạn yêu cầu, mọi lúc (đặt tên rất dễ gây hiểu lầm)
  • Mở rộng quy mô cơ bản: Nó sẽ mở rộng theo giới hạn bạn đặt và cũng sẽ giảm quy mô sau một thời gian nhất định

3. Các loại phiên bản: Có 2 loại phiên bản và về cơ bản chúng khác nhau về thời gian cần để tạo ra một phiên bản mới. Các cá thể lớp F (được sử dụng trong chia tỷ lệ tự động) có thể được tạo khi có nhu cầu trong vòng ~ 0,1 giây và các cá thể lớp B (được sử dụng trong chia tỷ lệ thủ công / cơ bản) trong vòng ~ 0,7 giây: nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Bây giờ bạn đã hiểu những điều cơ bản, hãy quay lại câu trả lời được chấp nhận:

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

Điều này hướng dẫn GAE là luôn chạy một lớp cá thể tùy chỉnh ( tốn kém hơn ). Rõ ràng đây không phải là lựa chọn rẻ nhất vì loại phiên bản B1 / F1 có thể được sử dụng thay thế (nó có thông số kỹ thuật thấp hơn) và nó cũng đang chạy một phiên bản liên tục.

Cách rẻ nhất là tắt phiên bản khi không có lưu lượng truy cập. Nếu bạn không bận tâm đến thời gian quay vòng ~ 0,1 giây, bạn có thể sử dụng điều này để thay thế:

instance_class: F1
automatic_scaling:
  max_instances: 1 (--> you can adjust this as you wish)
  min_instances: 0 (--> will scale to 0 when there is no traffic so won't incur costs)

Điều này sẽ nằm trong hạn ngạch miễn phí mà google cung cấp và bạn sẽ không mất bất cứ chi phí nào nếu bạn không có bất kỳ lưu lượng truy cập thực sự nào.

Tái bút: Bạn cũng nên thiết lập giới hạn chi tiêu hàng ngày trong trường hợp bạn quên thứ gì đó đang chạy hoặc bạn có một số cài đặt tốn kém ở đâu đó.


2
Bạn không thể đặt min_instancesthành 0. Theo tài liệu :The minimum number of instances given to your service. When a service is deployed, it is given this many instances and scales according to traffic. Must be 1 or greater, default is 2 to reduce latency.
yorbro

4
@yorbro cảm ơn bạn đã chỉ ra điều đó, min_instances dành cho môi trường tiêu chuẩn, tài liệu bạn đã liên kết đề cập đến tham số khác min_num_instances dành cho môi trường flex. Tôi sẽ cập nhật câu trả lời của mình để phản ánh rõ ràng điều này.
Caner

Ah xấu của tôi. Cảm ơn đã trả lời nhanh chóng!
yorbro

Trong tài liệu về min_instances có nói Cảnh báo: Để tính năng này hoạt động bình thường, bạn phải đảm bảo rằng các yêu cầu khởi động được bật và ứng dụng của bạn xử lý các yêu cầu khởi động. Điều này có phải được kích hoạt không? Nó sẽ ảnh hưởng gì đến độ trễ nếu điều này không được triển khai? Tôi đang cố gắng giảm chi phí chạy của mình cho một ứng dụng có khoảng 600 người dùng, vì vậy tôi đang cố gắng tìm ra cài đặt mở rộng tốt nhất là gì.
Pete Nice

cảnh báo đó có vẻ là mới, tôi chưa thấy nó bao giờ. Điều đó đang được nói, không biết về tác động của hiệu suất. chi tiết tại đây: cloud.google.com/appengine/docs/standard/python/…
Caner

16

Chúng tôi đã triển khai mã cho GAE FE hoàn toàn không thành công do lỗi phân tầng, theo cấp số nhân (email bị trả lại tạo ra email bị trả lại, v.v.) và chúng tôi KHÔNG thể tắt các phiên bản GAE đã bị nghe trộm. Sau hơn 4 giờ và hơn 1 triệu email được gửi (Mailgun sẽ KHÔNG cho phép chúng tôi vô hiệu hóa tài khoản. Nó cho biết "Vui lòng đợi tối đa 24 giờ để thay đổi mật khẩu có hiệu lực" và việc thu hồi khóa API không làm gì cả), redis VM đã bị dừng, DB ngừng hoạt động và tất cả mã của trang web được giảm xuống chỉ còn một trang tĩnh 503 "Không được bảo trì"), các email tiếp tục được gửi đi.

Tôi xác định rằng GAE FE chỉ đơn giản là không kết thúc máy ảo docker hoặc máy ảo tính toán đám mây (redis) đang chịu tải của CPU. Có lẽ không bao giờ! Sau khi chúng tôi thực sự xóa Compute VM (thay vì "chỉ" dừng nó), các email ngay lập tức dừng lại.

Tuy nhiên, DB của chúng tôi tiếp tục nhận được thông báo "không thể gửi email" trong tối đa 2 giờ nữa, mặc dù ứng dụng GAE báo cáo 100% các phiên bản và phiên bản là "Đã dừng". Tôi đã phải thay đổi mật khẩu Google Cloud SQL.

Chúng tôi tiếp tục kiểm tra hóa đơn và 7 trường hợp giả mạo tiếp tục sử dụng hết CPU và vì vậy chúng tôi đã hủy thẻ được sử dụng trên tài khoản đó và trên thực tế, trang web đã giảm giá khi hóa đơn quá hạn, nhưng các trường hợp giả mạo cũng vậy. Chúng tôi không bao giờ có thể giải quyết tình huống này với hỗ trợ qua email GAE.


Bây giờ tôi đã rời khỏi công ty đó từ lâu, tôi có thể nói với bạn rằng hóa đơn hàng tháng là khoảng 5.000 đô la, bình thường là khoảng 300 đô la.
Theodore R. Smith

Tôi đã sử dụng GCP và AWS trong vài năm qua và những câu chuyện như thế này khiến tôi muốn chạy theo AWS toàn thời gian. Các lỗ hổng trong tài liệu và kiểm tra lỗi của GCP đang rất khó khăn - đang được cải thiện, nhưng vẫn còn tồi tệ. Nó rẻ là có lý do. Điều đó nói rằng, tôi sắp triển khai một ứng dụng cho GAE, hãy giữ bia của tôi
ingernet

Thực sự là không thể liên lạc với bất kỳ ai tại Google nếu bạn gặp vấn đề nghiêm trọng với GCP. Chúng tôi đã cố gắng liên lạc với họ trong nhiều tháng về các vấn đề bất ổn tổng thể. Không đi.
Theodore R. Smith

Tôi đã rất may mắn với sự hỗ trợ kỹ thuật của họ, nhưng công ty của tôi cũng trả tiền cho một tài khoản hỗ trợ, soooo
ingernet Ngày

4

Cũng lưu ý rằng nếu bạn vẫn muốn ứng dụng của mình có khả năng tự động mở rộng quy mô nhưng bạn không muốn tối thiểu mặc định là 2 phiên bản luôn chạy, bạn có thể định cấu hình app.yaml của mình như sau:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1

Tôi nghĩ bạn có nghĩa là max_num_instances?
Dominic

4
Chắc chắn không có tùy chọn nào để giới hạn các trường hợp. Quay lại 1.000 trường hợp trong một cuộc tấn công DDoS và thanh toán cho khách hàng $ 1000 đô la là một chiến lược kinh doanh của GCP.
Theodore R. Smith

2
@ TheodoreR.Smith thực sự với tối đa bạn có thể và cũng thiết lập một giới hạn hàng ngày
zardilior

3
@Dominic min_num_instanceslà chính xác ở đây nếu bạn muốn tiết kiệm tiền khi nhàn rỗi với chi phí dự phòng. @Theodore Ngoài ra còn có max_num_instances để giới hạn các trường hợp, nhưng bạn không thể đặt giới hạn chi tiêu hàng ngày trên App Engine một cách linh hoạt (nhưng bạn có thể làm theo tiêu chuẩn). Tuy nhiên, bạn có thể thiết lập ngân sách và cảnh báo.
jon_wu

4

Vì không ai đề cập nên đây là các lệnh gcloud liên quan đến các phiên bản

# List all versions
$ gcloud app versions list

SERVICE  VERSION.ID       TRAFFIC_SPLIT  LAST_DEPLOYED              SERVING_STATUS
default  20200620t174631  0.00           2020-06-20T17:46:56+03:00  SERVING
default  20200620t174746  0.00           2020-06-20T17:48:12+03:00  SERVING
default  prod             1.00           2020-06-20T17:54:51+03:00  SERVING

# Delete these 2 versions (you can't delete all versions, you have to have at least one remaining)
$ gcloud app versions delete 20200620t174631 20200620t174746

# Help
$ gcloud app versions --help

1

đối với môi trường nhà phát triển nơi tôi không ngại một chút độ trễ, tôi đang sử dụng các cài đặt sau:

instance_class: B1
basic_scaling:
  max_instances: 1
  idle_timeout: 1m

Và nếu bạn sử dụng phiên bản của mình nhiều hơn mức cho phép phiên bản phụ trợ miễn phí, hãy thử điều này:

instance_class: F1
automatic_scaling:
  max_instances: 1

Đó là bảng điều khiển AppEngine, xem Phiên bản, ghi chú thời gian bắt đầu và theo dõi để đảm bảo rằng sau khoảng thời gian nhàn rỗi_timeout đã vượt qua số phiên bản giảm xuống 0 và bạn thấy thông báo "Phiên bản này không có phiên bản nào được triển khai".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.