Thiết lập và quản lý các dự án và sản phẩm Firebase thông qua Terraform

1. Giới thiệu

Bàn thắng

Bạn có thể sử dụng Terraform để thiết lập và quản lý dự án Firebase, bao gồm cấu hình theo chương trình của cơ sở hạ tầng và các sản phẩm Firebase.

Lớp học lập trình này trước tiên mô tả cách xây dựng tệp cấu hình Terraform để tạo dự án Firebase mới, sau đó là cách định cấu hình các ứng dụng và sản phẩm Firebase mà bạn muốn sử dụng trong dự án đó. Chúng tôi cũng đề cập đến những điều cơ bản về dòng lệnh Terraform, như xem trước các thay đổi sẽ được thực hiện và sau đó triển khai chúng.

Nếu bạn muốn tìm hiểu cách thiết lập và quản lý các dự án cũng như sản phẩm Firebase bằng Terraform thì lớp học lập trình này là dành cho bạn!

Bạn sẽ học được gì

  • Cách tạo tệp cấu hình Terraform ( *.tf )
  • Cách sử dụng lệnh Terraform CLI để quản lý cơ sở hạ tầng của bạn
  • Cách sửa đổi cấu hình của bạn để cập nhật tài nguyên và dịch vụ của bạn
  • Cách áp dụng cấu hình của bạn trên ứng dụng web thực (được gọi là Trò chuyện thân thiện )
  • Cách xác định cấu hình song song (và không đồng bộ) trong các môi trường khác nhau (sản xuất, dàn dựng, v.v.)

Những gì bạn cần

Để thành công với lớp học lập trình này, bạn cần có trình độ cơ bản về Terraform và thuật ngữ của nó, bao gồm các điều kiện tiên quyết sau:

Lớp học lập trình này cung cấp một ứng dụng mẫu thực tế để bạn có thể thử nghiệm và tương tác với những gì bạn cung cấp thông qua Terraform. Để làm điều này, bạn sẽ cần những điều sau đây:

  • Mã mẫu cho ứng dụng web - tải mã này xuống ở bước tiếp theo của lớp học lập trình
  • Trình quản lý gói npm (thường đi kèm với Node.js ) - cài đặt các công cụ này
  • Firebase CLI - cài đặt CLI này và đăng nhập

2. Lấy mã khởi đầu

Trong lớp học lập trình này, bạn có thể kiểm tra những gì bạn cung cấp qua Terraform bằng một ứng dụng web thực. Chúng tôi khuyên bạn nên làm điều này để bạn hiểu tất cả các bước cần thiết để sử dụng tài nguyên do Terraform cung cấp.

Sao chép kho lưu trữ GitHub của lớp học lập trình từ dòng lệnh:

git clone https://github.com/firebase/codelab-friendlychat-web

Ngoài ra, nếu bạn chưa cài đặt git, bạn có thể tải xuống kho lưu trữ dưới dạng tệp ZIP .

3. Tạo cấu hình Terraform

Thiết lập địa hình

  1. Trong cơ sở mã của ứng dụng mẫu đã tải xuống, hãy điều hướng đến thư mục gốc của thư mục web .
  2. Ở thư mục gốc của thư mục đó, tạo tệp cấu hình Terraform có tên main.tf với thiết lập ban đầu sau:

    main.tf
    # Terraform configuration to set up providers by version.
    terraform {
      required_providers {
        google-beta = {
          source  = "hashicorp/google-beta"
          version = "~> 4.0"
        }
      }
    }
    
    # Configure the provider not to use the specified project for quota check.
    # This provider should only be used during project creation and initializing services.
    provider "google-beta" {
      alias                 = "no_user_project_override"
      user_project_override = false
    }
    
    # Configure the provider that uses the new project's quota.
    provider "google-beta" {
      user_project_override = true
    }
    

Mỗi nhà cung cấp google-beta đều có một thuộc tính có tên user_project_override để xác định cách kiểm tra hạn ngạch các hoạt động từ Terraform. Để cung cấp hầu hết các tài nguyên, bạn nên sử dụng user_project_override = true , nghĩa là kiểm tra hạn ngạch đối với dự án Firebase của riêng bạn. Tuy nhiên, để thiết lập dự án mới của bạn để dự án có thể chấp nhận kiểm tra hạn ngạch, trước tiên bạn cần sử dụng user_project_override=false . Cú pháp alias Terraform cho phép bạn phân biệt giữa hai cách thiết lập nhà cung cấp trong các bước tiếp theo của lớp học lập trình này.

Khởi tạo Terraform trong thư mục

Tạo cấu hình mới lần đầu tiên yêu cầu tải xuống nhà cung cấp được chỉ định trong cấu hình.

Để thực hiện việc khởi tạo này, hãy chạy lệnh sau từ thư mục gốc của cùng thư mục với tệp cấu hình main.tf của bạn:

terraform init

4. Tạo dự án Firebase qua Terraform

Để "tạo dự án Firebase", điều quan trọng cần nhớ là mỗi dự án Firebase thực sự là một dự án Google Cloud, chỉ cần bật dịch vụ Firebase cho dự án đó.

Thêm các khối cho dự án và API cơ bản của Google Cloud

  1. Đầu tiên, hãy cung cấp dự án Google Cloud cơ bản.

    Vào tệp cấu hình main.tf của bạn, hãy thêm khối tài nguyên sau.

    Bạn cần chỉ định tên dự án của riêng mình (như "Terraform FriendlyChat Codelab" ) và ID dự án của riêng bạn (như "terraform-codelab-your-initials" ). Lưu ý rằng giá trị name chỉ được sử dụng trong giao diện Firebase và không hiển thị cho người dùng cuối. Tuy nhiên, giá trị project_id xác định duy nhất dự án của bạn với Google, vì vậy hãy đảm bảo bạn chỉ định một giá trị duy nhất. main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
  2. Tiếp theo, bạn cần kích hoạt các API cơ bản bắt buộc: API sử dụng dịch vụ và API quản lý Firebase.

    Việc kích hoạt API này thường được xử lý ngầm khi bạn sử dụng bảng điều khiển Firebase để tạo dự án Firebase, nhưng Terraform cần được yêu cầu rõ ràng để thực hiện việc kích hoạt này.

    Vào tệp cấu hình main.tf của bạn (ngay dưới khối tạo dự án Đám mây mới), hãy thêm khối tài nguyên sau:

    main.tf
    ...
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "serviceusage" {
      provider = google-beta.no_user_project_override
    
      project = google_project.default.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "firebase" {
      provider = google-beta.no_user_project_override
    
      project = google_project.default.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    Bằng cách bật API sử dụng dịch vụ, dự án mới của bạn sẽ có thể chấp nhận kiểm tra hạn ngạch! Vì vậy, đối với tất cả việc cung cấp tài nguyên và kích hoạt dịch vụ tiếp theo, bạn nên sử dụng nhà cung cấp user_project_override (không cần bí danh).

Thêm một khối để kích hoạt dịch vụ Firebase

Điều cuối cùng cần thiết để "tạo dự án Firebase" là kích hoạt các dịch vụ Firebase trên dự án.

Tiếp tục trong tệp cấu hình main.tf của bạn, thêm khối tài nguyên sau.

Như đã đề cập ở trên, hãy lưu ý rằng khối tài nguyên này đang sử dụng nhà cung cấp user_project_override (không cần bí danh).

chính.tf

...

# Enable Firebase services for the new project created above.
resource "google_firebase_project" "default" {
  provider = google-beta

  project = google_project.default.project_id

  # Wait until the required APIs are enabled.
  depends_on = [
    google_project_service.firebase,
    google_project_service.serviceusage,
  ]
}

Trong khối tài nguyên ở trên, bạn có thể nhận thấy mệnh đề depends_on , mệnh đề này yêu cầu Terraform đợi các API cơ bản được bật. Nếu không có điều khoản này, Terraform không biết về sự phụ thuộc và có thể gặp lỗi khi cung cấp tài nguyên song song.

Áp dụng cấu hình

  1. Để cung cấp tài nguyên mới và kích hoạt các API được chỉ định trong tệp cấu hình của bạn, hãy chạy lệnh sau từ thư mục gốc của cùng thư mục với tệp main.tf của bạn (phải là web ):
    terraform apply
    
  2. Trong thiết bị đầu cuối, Terraform in kế hoạch hành động mà nó sẽ thực hiện.

    Nếu mọi thứ trông như mong đợi, hãy phê duyệt các hành động bằng cách nhập yes .

    main.tf
    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
      # google_firebase_project.default will be created
      + resource "google_firebase_project" "default" {
          + display_name   = (known after apply)
          + id             = (known after apply)
          + project        = "terraform-friendlychat-codelab"
          + project_number = (known after apply)
        }
    
      # google_project.default will be created
      + resource "google_project" "default" {
          + auto_create_network = true
          + id                  = (known after apply)
          + labels              = {
              + "firebase" = "enabled"
            }
          + name                = "Terraform FriendlyChat Codelab"
          + number              = (known after apply)
          + project_id          = "terraform-friendlychat-codelab"
          + skip_delete         = (known after apply)
        }
    
      # google_project_service.firebase will be created
      + resource "google_project_service" "firebase" {
          + disable_on_destroy = false
          + id                 = (known after apply)
          + project            = "terraform-friendlychat-codelab"
          + service            = "firebase.googleapis.com"
        }
    
      # google_project_service.serviceusage will be created
      + resource "google_project_service" "serviceusage" {
          + disable_on_destroy = false
          + id                 = (known after apply)
          + project            = "terraform-friendlychat-codelab"
          + service            = "serviceusage.googleapis.com"
        }
    
    Plan: 4 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes # <----
    

Lưu ý rằng nếu bạn chỉ cần xem trước các thay đổi mà không áp dụng, thay vào đó bạn có thể sử dụng lệnh terraform plan .

Xác thực các thay đổi

Sau khi Terraform chạy xong, bạn có thể kiểm tra trạng thái của tất cả các tài nguyên và dịch vụ do Terraform cung cấp được kích hoạt bằng cách chạy lệnh sau:

terraform show

Đây là một ví dụ về những gì bạn sẽ thấy được in. Trạng thái của bạn sẽ chứa các giá trị cụ thể cho dự án của bạn.

# google_firebase_project.default:
resource "google_firebase_project" "default" {
    display_name   = "Terraform FriendlyChat Codelab"
    id             = "projects/terraform-friendlychat-codelab"
    project        = "terraform-friendlychat-codelab"
    project_number = "000000000"
}

# google_project.default:
resource "google_project" "default" {
    auto_create_network = true
    id                  = "projects/terraform-friendlychat-codelab"
    labels              = {
        "firebase" = "enabled"
    }
    name                = "Terraform FriendlyChat Codelab"
    number              = "000000000"
    project_id          = "terraform-friendlychat-codelab"
}

# google_project_service.firebase:
resource "google_project_service" "firebase" {
    disable_on_destroy = false
    id                 = "terraform-friendlychat-codelab/firebase.googleapis.com"
    project            = "terraform-friendlychat-codelab"
    service            = "firebase.googleapis.com"
}

# google_project_service.serviceusage:
resource "google_project_service" "serviceusage" {
    disable_on_destroy = false
    id                 = "terraform-friendlychat-codelab/serviceusage.googleapis.com"
    project            = "terraform-friendlychat-codelab"
    service            = "serviceusage.googleapis.com"
}

Ngoài ra, bạn có thể xác minh rằng dự án đã được tạo bằng cách xem dự án đó trong bảng điều khiển Firebase .

The Terraform FriendlyChat Codelab project selected on the Firebase console

5. Đăng ký ứng dụng Firebase của bạn qua Terraform

Để sử dụng Firebase, bạn cần đăng ký từng biến thể nền tảng của ứng dụng trong dự án Firebase của mình. Trong lớp học lập trình này, bạn sẽ sử dụng một ứng dụng thực để kiểm tra và tương tác với những gì bạn cung cấp qua Terraform. Ứng dụng này là một ứng dụng web, vì vậy bạn cần yêu cầu Terraform đăng ký Ứng dụng web Firebase trong dự án Firebase mới tạo của bạn.

Thêm một khối để đăng ký ứng dụng web

Để đăng ký ứng dụng web của bạn trong dự án Firebase, hãy thêm tệp main.tf của bạn với khối tài nguyên sau.

Bạn cần chỉ định display_name của riêng mình cho ứng dụng web của mình. Lưu ý rằng tên này chỉ được sử dụng trong giao diện Firebase và không hiển thị cho người dùng cuối.

chính.tf

...

# Create a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "default" {
  provider = google-beta

  project      = google_firebase_project.default.project
  display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
  deletion_policy = "DELETE"
}

Áp dụng cấu hình

  1. Để cung cấp tài nguyên mới, hãy chạy lệnh sau từ thư mục gốc của cùng thư mục với tệp main.tf của bạn (phải là web ).
    terraform apply
    
    Xin lưu ý rằng lệnh này sẽ không tạo lại dự án Google Cloud mới. Terraform sẽ phát hiện rằng một dự án có ID dự án được chỉ định đã tồn tại và sẽ so sánh trạng thái hiện tại của dự án với những gì có trong tệp .tf và thực hiện bất kỳ thay đổi nào mà nó tìm thấy.
  2. Xem lại kế hoạch hành động đã in. Nếu mọi thứ trông như mong đợi, hãy nhập yes và nhấn Enter để phê duyệt các hành động.

Xác thực các thay đổi

Bạn có thể kiểm tra trạng thái của tài nguyên mới được cung cấp bằng cách chạy lệnh sau:

terraform show

Ngoài ra, bạn có thể xác minh rằng ứng dụng đã được đăng ký thành công trong dự án của mình bằng cách xem ứng dụng đó trong bảng điều khiển Firebase. Đi tới Cài đặt dự án , sau đó cuộn xuống phần Ứng dụng của bạn .

6. Thiết lập xác thực Firebase

Xác thực là một phần quan trọng của bất kỳ ứng dụng nào. Để cho phép người dùng cuối đăng nhập vào ứng dụng web của bạn bằng tài khoản Google của họ, bạn có thể bật Xác thực Firebase và thiết lập đăng nhập bằng phương pháp Google.

Xin lưu ý rằng trong lớp học lập trình này, chúng tôi cung cấp hai tùy chọn khác nhau để thiết lập Xác thực Firebase:

  • Tùy chọn 1 (Được khuyến nghị) : Thiết lập Xác thực Firebase trong bảng điều khiển, không yêu cầu GCIP.
    • Sử dụng tùy chọn này có nghĩa là bạn không phải liên kết dự án mới của mình với tài khoản Thanh toán trên nền tảng đám mây.
  • Tùy chọn 2 : Thiết lập Xác thực Firebase qua Terraform bằng API Google Cloud Identity Platform (GCIP).
    • Sử dụng tùy chọn này có nghĩa là bạn phải liên kết dự án mới của mình với tài khoản Thanh toán trên nền tảng đám mây vì GCIP yêu cầu dự án phải nằm trong gói định giá Blaze.

Tùy chọn 1: Thiết lập Xác thực bằng bảng điều khiển Firebase

Để thiết lập Xác thực Firebase bằng bảng điều khiển Firebase, dự án của bạn không cần phải nằm trong gói giá Blaze.

Dưới đây là cách thiết lập Xác thực Firebase và đăng nhập bằng Google:

  1. Trong bảng điều khiển Firebase , tìm phần Xây dựng ở bảng điều khiển bên trái.
  2. Nhấp vào Xác thực , nhấp vào Bắt đầu , sau đó nhấp vào tab Phương thức đăng nhập (hoặc nhấp vào đây để truy cập trực tiếp vào đó).
  3. Nhấp vào Thêm nhà cung cấp mới và từ phần Nhà cung cấp bổ sung , chọn Google .
  4. Kích hoạt nút bật tắt Bật .
  5. Đặt tên công khai cho ứng dụng của bạn thành tên như FriendlyChat (tên này không cần phải là duy nhất trên toàn cầu).
  6. Chọn email hỗ trợ Dự án từ menu thả xuống rồi nhấp vào Lưu . Configuring Firebase Auth on the Firebase console
  7. Bạn sẽ thấy Google là nhà cung cấp dịch vụ đăng nhập được bật. Firebase console Authentication page: Google sign-in enabled

Tùy chọn 2: Thiết lập xác thực qua Terraform bằng API Google Cloud Identity Platform (GCIP)

Để thiết lập Xác thực Firebase qua Terraform, bạn phải sử dụng API GCIP, nghĩa là dự án phải nằm trong gói định giá Blaze. Bạn nâng cấp dự án Firebase của mình để sử dụng gói Blaze bằng cách liên kết tài khoản Thanh toán trên đám mây với dự án.

Kích hoạt tính năng thanh toán qua Terraform

  1. Nếu bạn chưa có tài khoản Cloud Billing thì bước đầu tiên là tạo tài khoản mới trong Google Cloud Console . Khi bạn thực hiện việc này, hãy ghi lại ID tài khoản thanh toán của nó. ID tài khoản thanh toán có thể được tìm thấy trên trang Thanh toán trong ID tài khoản thanh toán được liên kết với dự án của bạn. Enabling a billing account using the Google Cloud console
  2. Để bật tính năng thanh toán trong dự án của bạn thông qua Terraform, hãy thêm thuộc tính billing_account vào tài nguyên google_project hiện có trong tệp main.tf của bạn:

    main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Add this line with your Cloud Billing account ID
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
    ...
    

Kích hoạt Xác thực Firebase và đăng nhập bằng Google qua Terraform

  1. Để cung cấp Xác thực Firebase bằng GCIP, hãy thêm tệp main.tf của bạn với các khối tài nguyên sau:

    main.tf
    ...
    
    # Enable the Identity Toolkit API.
    resource "google_project_service" "auth" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      service =  "identitytoolkit.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Create an Identity Platform config.
    # Also, enable Firebase Authentication using Identity Platform (if Authentication isn't yet enabled).
    resource "google_identity_platform_config" "auth" {
      provider = google-beta
      project  = google_firebase_project.default.project
    
      # For example, you can configure to auto-delete anonymous users.
      autodelete_anonymous_users = true
    
      # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication.
      depends_on = [
        google_project_service.auth,
      ]
    }
    
  2. Việc bật đăng nhập bằng Google yêu cầu bạn phải có ứng dụng khách OAuth . Đi tới phần API & Dịch vụ của Google Cloud Console để thực hiện thiết lập này.
  3. Vì đây là lần đầu tiên bạn tạo ID khách hàng cho dự án này nên bạn cần định cấu hình màn hình đồng ý OAuth của mình.
    1. Mở trang màn hình đồng ý OAuth , sau đó chọn dự án bạn vừa tạo.
    2. Đặt Loại người dùng thành Bên ngoài , sau đó nhấp vào Tạo .
    3. Trong màn hình tiếp theo, hãy hoàn thành các bước sau rồi nhấp vào Lưu và tiếp tục .
      • Đặt tên Ứng dụng công khai cho ứng dụng của bạn thành tên như FriendlyChat (tên này không cần phải là duy nhất trên toàn cầu).
      • Chọn email hỗ trợ người dùng từ menu thả xuống.
      • Nhập email để biết thông tin liên hệ của Nhà phát triển .
    4. Trong màn hình tiếp theo, hãy hoàn thành các bước sau:
      • Chấp nhận các giá trị mặc định trên trang Phạm vi , sau đó nhấp vào Lưu và Tiếp tục .
      • Chấp nhận các giá trị mặc định trên trang Người dùng thử nghiệm , sau đó nhấp vào Lưu và tiếp tục .
      • Xem lại bản tóm tắt rồi nhấp vào Quay lại trang tổng quan .
      Configuring an OAuth2 client using the Google Cloud console
  4. Thiết lập ứng dụng khách OAuth trong trang Thông tin xác thực bằng cách thực hiện như sau:
    1. Nhấp vào Tạo thông tin xác thực và chọn ID ứng dụng khách OAuth .
    2. Từ danh sách thả xuống Loại ứng dụng , chọn Ứng dụng web .
    3. Trong trường Tên , nhập tên ứng dụng của bạn, ví dụ FriendlyChat (tên này không cần phải duy nhất trên toàn cầu).
    4. Cho phép URL ứng dụng của bạn sử dụng ứng dụng khách OAuth này bằng cách đặt các tùy chọn sau:
      • Trong Nguồn gốc JavaScript được ủy quyền , hãy nhấp vào Thêm URI và nhập
        https://<PROJECT_ID>.firebaseapp.com , trong đó <PROJECT_ID> là ID dự án bạn đặt trong main.tf .
      • Trong URI chuyển hướng được ủy quyền , hãy nhấp vào Thêm URI và nhập
        https://<PROJECT_ID>.firebaseapp.com/__/auth/handler , trong đó <PROJECT_ID> là ID dự án bạn đặt trong main.tf .
    5. Nhấp vào để lưu .
    Obtaining the OAuth2 Client ID and secret from the Google Cloud console Credentials page
  5. Để cho phép đăng nhập bằng Google bằng ID ứng dụng khách OAuth và bí mật ứng dụng khách của bạn, hãy thêm tệp main.tf của bạn với khối sau:

    main.tf
    ...
    
    variable "oauth_client_secret" {
      type = string
    
      description = "OAuth client secret. For this codelab, you can pass in this secret through the environment variable TF_VAR_oauth_client_secret. In a real app, you should use a secret manager service."
    
      sensitive = true
    }
    
    resource "google_identity_platform_default_supported_idp_config" "google_sign_in" {
      provider = google-beta
      project  = google_firebase_project.default.project
    
      enabled       = true
      idp_id        = "google.com"
      client_id     = "<YOUR_OAUTH_CLIENT_ID>"
      client_secret = var.oauth_client_secret
    
      depends_on = [
         google_identity_platform_config.auth
      ]
    }
    

Áp dụng cấu hình

  1. Để thiết lập Xác thực theo cấu hình của bạn, hãy chạy các lệnh sau từ thư mục gốc của cùng thư mục với tệp main.tf của bạn (phải là web ):
    export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
    
    terraform apply
    
    Lưu ý rằng việc chạy terraform apply sẽ không tạo lại một dự án Google Cloud mới. Terraform sẽ phát hiện rằng một dự án có ID dự án được chỉ định đã tồn tại và sẽ so sánh trạng thái hiện tại của dự án với những gì có trong tệp .tf . Sau đó nó sẽ thực hiện bất kỳ thay đổi nào mà nó tìm thấy.
  2. Xem lại kế hoạch hành động đã in. Nếu mọi thứ trông như mong đợi, hãy nhập yes và nhấn Enter để phê duyệt các hành động.

Xác thực các thay đổi

  1. Trong bảng điều khiển Firebase , tìm phần Xây dựng ở bảng điều khiển bên trái.
  2. Nhấp vào Xác thực rồi nhấp vào tab Phương thức đăng nhập (hoặc nhấp vào đây để truy cập trực tiếp vào đó).
  3. Bạn sẽ thấy Google là nhà cung cấp dịch vụ đăng nhập được bật. Firebase console Authentication page: Google sign-in enabled

7. Thiết lập cơ sở dữ liệu Firestore và Quy tắc bảo mật của nó

Đối với ứng dụng web của lớp học lập trình này, bạn sẽ lưu trữ tin nhắn giữa những người dùng cuối trong cơ sở dữ liệu Firestore.

  1. Để kích hoạt các API cần thiết và cung cấp phiên bản cơ sở dữ liệu, hãy thêm tệp main.tf của bạn với các khối tài nguyên sau:

    main.tf
    ...
    
    # Enable required APIs for Cloud Firestore.
    resource "google_project_service" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "firestore.googleapis.com",
        "firebaserules.googleapis.com",
      ])
      service = each.key
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Provision the Firestore database instance.
    resource "google_firestore_database" "default" {
      provider                    = google-beta
    
      project                     = google_firebase_project.default.project
      name                        = "(default)"
      # See available locations:
      # https://firebase.google.com/docs/firestore/locations
      location_id                 = "<NAME_OF_DESIRED_REGION>"
      # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs,
      # authentication, and Firebase Security Rules.
      type                        = "FIRESTORE_NATIVE"
      concurrency_mode            = "OPTIMISTIC"
    
      depends_on = [
        google_project_service.firestore
      ]
    }
    
  2. Thay đổi <NAME_OF_DESIRED_REGION> thành vùng mà bạn muốn đặt cơ sở dữ liệu.

    Khi phát triển một ứng dụng sản xuất, bạn sẽ muốn ứng dụng này nằm trong khu vực gần với phần lớn người dùng và có điểm chung với các dịch vụ Firebase khác, như Cloud Functions. Đối với lớp học lập trình này, bạn có thể sử dụng us-east1 (Nam Carolina) hoặc sử dụng khu vực gần bạn nhất (xem các vị trí Cloud Firestore ).
  3. Mọi phiên bản cơ sở dữ liệu Firestore mà Firebase có thể truy cập phải được bảo vệ bởi Quy tắc bảo mật Firebase .

    Mã mẫu của lớp học lập trình này cung cấp một bộ quy tắc Firestore an toàn trong tệp firestore.rules mà bạn có thể tìm thấy ở thư mục gốc của thư mục web .
  4. Nối tệp main.tf của bạn với các khối tài nguyên sau để thực hiện những việc sau:
    • Tạo bộ quy tắc Quy tắc bảo mật Firebase từ tệp firestore.rules cục bộ.
    • Phát hành bộ quy tắc cho phiên bản Firestore.
    Lưu ý rằng các khối tài nguyên này thực hiện tương đương với việc nhấp vào nút Xuất bản trong bảng điều khiển Firebase hoặc chạy firebase deploy --only firestore:rules .

    main.tf
    ...
    
    # Create a ruleset of Firestore Security Rules from a local file.
    resource "google_firebaserules_ruleset" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      source {
        files {
          name = "firestore.rules"
          # Write security rules in a local file named "firestore.rules".
          # Learn more: https://firebase.google.com/docs/firestore/security/get-started
          content = file("firestore.rules")
        }
      }
    
      # Wait for Firestore to be provisioned before creating this ruleset.
      depends_on = [
        google_firestore_database.default,
      ]
    }
    
    # Release the ruleset for the Firestore instance.
    resource "google_firebaserules_release" "firestore" {
      provider     = google-beta
    
      name         = "cloud.firestore"  # must be cloud.firestore
      ruleset_name = google_firebaserules_ruleset.firestore.name
      project      = google_firebase_project.default.project
    
      # Wait for Firestore to be provisioned before releasing the ruleset.
      depends_on = [
        google_firestore_database.default,
      ]
    
      lifecycle {
        replace_triggered_by = [
          google_firebaserules_ruleset.firestore
        ]
      }
    }
    
  5. Chạy terraform apply để cung cấp cơ sở dữ liệu Firestore và triển khai các quy tắc bảo mật của nó.
  6. Xác minh rằng cơ sở dữ liệu được cung cấp và các quy tắc bảo mật của nó được triển khai:
    1. Trong bảng điều khiển Firebase , tìm phần Xây dựng ở bảng điều khiển bên trái.
    2. Chuyển đến phần Cơ sở dữ liệu Firestore , sau đó nhấp vào tab Quy tắc .
    Verifying Cloud Firestore rules using the Firebase console

8. Thiết lập nhóm Lưu trữ đám mây và Quy tắc bảo mật của nó

Đối với ứng dụng web của lớp học lập trình này, bạn sẽ lưu trữ hình ảnh được chia sẻ giữa những người dùng cuối trong bộ chứa Cloud Storage.

  1. Để bật các API cần thiết và cung cấp nhóm mặc định của Cloud Storage, hãy thêm tệp main.tf của bạn với các khối tài nguyên sau.

    Lưu ý rằng nhóm Cloud Storage mặc định cho dự án của bạn được cung cấp thông qua Google App Engine và phải có cùng vị trí với cơ sở dữ liệu Firestore của bạn. Xem vị trí App Engine để biết thêm thông tin.

    Nếu bạn muốn có nhiều nhóm trong dự án của mình, hãy cung cấp các nhóm đó bằng tài nguyên google_storage_bucket (không hiển thị trong lớp học lập trình này).

    main.tf
    ...
    
    # Enable required APIs for Cloud Storage for Firebase.
    resource "google_project_service" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "firebasestorage.googleapis.com",
        "storage.googleapis.com",
      ])
      service = each.key
    
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Provision the default Cloud Storage bucket for the project via Google App Engine.
    resource "google_app_engine_application" "default" {
      provider    = google-beta
    
      project     = google_firebase_project.default.project
      # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
      # This will set the location for the default Storage bucket and the App Engine App.
      location_id = "<NAME_OF_DESIRED_REGION_FOR_DEFAULT_BUCKET>"  # Must be in the same location as Firestore (above)
    
      # Wait until Firestore is provisioned first.
      depends_on = [
        google_firestore_database.default
      ]
    }
    
    # Make the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
    resource "google_firebase_storage_bucket" "default-bucket" {
      provider  = google-beta
    
      project   = google_firebase_project.default.project
      bucket_id = google_app_engine_application.default.default_bucket
    }
    
  2. Mọi nhóm Lưu trữ đám mây mà Firebase có thể truy cập đều phải được bảo vệ bởi Quy tắc bảo mật của Firebase .

    Mã mẫu của lớp học lập trình này cung cấp một bộ quy tắc Firestore an toàn trong tệp storage.rules mà bạn có thể tìm thấy ở thư mục gốc của thư mục web .
  3. Nối tệp main.tf của bạn với các khối tài nguyên sau để thực hiện những việc sau:
    • Tạo bộ quy tắc Quy tắc bảo mật Firebase từ tệp cục bộ.
    • Phát hành bộ quy tắc cho vùng lưu trữ.
    Lưu ý rằng các khối tài nguyên này thực hiện tương đương với việc nhấp vào nút Xuất bản trong bảng điều khiển Firebase hoặc chạy firebase deploy --only storage .

    main.tf
    ...
    
    # Create a ruleset of Cloud Storage Security Rules from a local file.
    resource "google_firebaserules_ruleset" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      source {
        files {
          # Write security rules in a local file named "storage.rules".
          # Learn more: https://firebase.google.com/docs/storage/security/get-started
          name    = "storage.rules"
          content = file("storage.rules")
        }
      }
    
      # Wait for the default Storage bucket to be provisioned before creating this ruleset.
      depends_on = [
        google_firebase_storage_bucket.default-bucket,
      ]
    }
    
    # Release the ruleset to the default Storage bucket.
    resource "google_firebaserules_release" "default-bucket" {
      provider     = google-beta
    
      name         = "firebase.storage/${google_app_engine_application.default.default_bucket}"
      ruleset_name = "projects/${google_firebase_project.default.project}/rulesets/${google_firebaserules_ruleset.storage.name}"
      project      = google_firebase_project.default.project
    
      lifecycle {
        replace_triggered_by = [
          google_firebaserules_ruleset.storage
        ]
      }
    }
    
  4. Chạy terraform apply để cung cấp nhóm Cloud Storage mặc định và triển khai các quy tắc bảo mật của nó.
  5. Xác minh rằng nhóm đã được cung cấp và các quy tắc bảo mật của nhóm đó đã được triển khai:
    1. Trong bảng điều khiển Firebase , tìm phần Xây dựng ở bảng điều khiển bên trái.
    2. Đi tới phần Lưu trữ , sau đó nhấp vào tab Quy tắc .
    Verifying security rules using the Firebase console

9. Chạy ứng dụng của bạn cục bộ

Bây giờ bạn đã sẵn sàng chạy ứng dụng web của mình lần đầu tiên! Bạn sẽ sử dụng trình mô phỏng Firebase Hosting để phân phối ứng dụng của mình cục bộ.

  1. Mở một cửa sổ terminal mới và từ thư mục web , chạy lệnh Firebase CLI sau để khởi động trình mô phỏng:
    firebase emulators:start --project=<PROJECT_ID>
    
  2. Trong trình duyệt của bạn, hãy mở ứng dụng web của bạn tại URL cục bộ được CLI trả về (thường là http://localhost:5000 ).

Bạn sẽ thấy giao diện người dùng của ứng dụng FriendlyChat, giao diện này chưa (chưa!) hoạt động. Ứng dụng chưa được kết nối với Firebase, nhưng bằng cách hoàn thành các bước tiếp theo của lớp học lập trình này, ứng dụng sẽ kết nối được!

Xin lưu ý rằng bất cứ khi nào bạn thực hiện thay đổi đối với ứng dụng web của mình (như bạn sẽ thực hiện trong các bước sau của lớp học lập trình này), hãy làm mới trình duyệt của bạn để cập nhật URL cục bộ với những thay đổi đó.

10. Cài đặt, định cấu hình và khởi chạy Firebase

Để ứng dụng hoạt động với Firebase, ứng dụng của bạn cần có SDK Firebase và cấu hình Firebase cho dự án Firebase của bạn.

Mã mẫu cho lớp học lập trình này đã là một ứng dụng đang hoạt động với tất cả các phần phụ thuộc và chức năng cần thiết để sử dụng nhiều sản phẩm Firebase khác nhau trong ứng dụng. Bạn có thể xem trong web/package.jsonweb/src/index.js nếu bạn muốn xem những gì đã được thực hiện.

Mặc dù mã mẫu gần như đã hoàn tất nhưng bạn vẫn cần thực hiện một số việc để ứng dụng của mình chạy, bao gồm: cài đặt SDK Firebase, khởi động bản dựng, thêm cấu hình Firebase vào ứng dụng của bạn và cuối cùng là khởi chạy Firebase.

Cài đặt SDK Firebase và bắt đầu xây dựng gói webpack của bạn

Bạn cần chạy một số lệnh để bắt đầu xây dựng ứng dụng của mình.

  1. Mở một cửa sổ terminal mới.
  2. Hãy chắc chắn rằng bạn đang ở thư mục gốc của thư mục web .
  3. Chạy npm install để tải xuống SDK Firebase.
  4. Chạy npm update để cập nhật mọi phụ thuộc.
  5. Chạy npm run start để khởi động webpack.

Đối với phần còn lại của lớp học lập trình, giờ đây, webpack sẽ liên tục xây dựng lại mã nguồn của bạn.

Thêm cấu hình Firebase vào ứng dụng của bạn

Bạn cũng cần thêm cấu hình Firebase vào ứng dụng của mình để SDK Firebase biết bạn muốn họ sử dụng dự án Firebase nào.

Đối với lớp học lập trình này, bạn có hai tùy chọn khác nhau để nhận cấu hình Firebase:

  • Tùy chọn 1 : Lấy cấu hình Firebase của bạn từ bảng điều khiển Firebase.
  • Tùy chọn 2 : Lấy cấu hình Firebase của bạn thông qua Terraform.

Tùy chọn 1: Lấy cấu hình từ bảng điều khiển Firebase và thêm nó vào cơ sở mã của bạn

  1. Trong bảng điều khiển Firebase, hãy đi tới cài đặt Dự án của bạn.
  2. Cuộn xuống thẻ Ứng dụng của bạn rồi chọn ứng dụng web của bạn.
  3. Chọn Cấu hình từ ngăn đoạn mã Firebase SDK, sau đó sao chép đoạn mã cấu hình.
  4. Dán cấu hình của bạn vào tệp web/src/firebase-config.js của ứng dụng, như sau:

    firebase-config.js
    ...
    
    const config = {
      apiKey: "<API_KEY>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      projectId: "<PROJECT_ID>",
      storageBucket: "<PROJECT_ID>.appspot.com",
      messagingSenderId: "<SENDER_ID>",
      appId: "<APP_ID>",
      measurementId: "<G-MEASUREMENT_ID>",
    };
    
    ...
    

Tùy chọn 2: Lấy cấu hình qua Terraform và thêm nó vào cơ sở mã của bạn

Ngoài ra, bạn có thể lấy cấu hình Firebase của mình thông qua Terraform dưới dạng giá trị đầu ra trong CLI.

  1. Trong tệp main.tf của bạn, hãy tìm khối tài nguyên google_firebase_web_app (khối đã đăng ký ứng dụng web với dự án của bạn).
  2. Ngay sau khối đó, thêm các khối sau:

    main.tf
    ...
    
    data "google_firebase_web_app_config" "default" {
      provider     = google-beta
      project      = google_firebase_project.default.project
      web_app_id   = google_firebase_web_app.default.app_id
    }
    
    output "friendlychat_web_app_config" {
      value = {
        projectId         = google_firebase_project.default.project
        appId             = google_firebase_web_app.default.app_id
        apiKey            = data.google_firebase_web_app_config.default.api_key
        authDomain        = data.google_firebase_web_app_config.default.auth_domain
        storageBucket     = lookup(data.google_firebase_web_app_config.default, "storage_bucket", "")
        messagingSenderId = lookup(data.google_firebase_web_app_config.default, "messaging_sender_id", "")
        measurementId     = lookup(data.google_firebase_web_app_config.default, "measurement_id", "")
      }
    }
    
    ...
    
  3. Vì khối data và khối output không nhằm mục đích sửa đổi cơ sở hạ tầng theo bất kỳ cách nào nên bạn chỉ cần chạy các lệnh sau.
    1. Để tải cấu hình Firebase của ứng dụng web của bạn vào trạng thái Terraform trong thư mục của bạn, hãy chạy lệnh này:
      terraform refresh
      
    2. Để in các giá trị cấu hình Firebase, hãy chạy lệnh này:
      terraform output –json
      
      Sau đây là ví dụ đầu ra của tệp config. Đầu ra được in của bạn sẽ chứa các giá trị của dự án và ứng dụng của bạn.
      {
        "friendlychat_web_app_config": {
          "sensitive": false,
          "type": [
            "object",
            {
              "apiKey": "string",
              "appId": "string",
              "authDomain": "string",
              "measurementId": "string",
              "messagingSenderId": "string",
              "projectId": "string",
              "storageBucket": "string"
            }
          ],
          "value": {
            "apiKey": "<API_KEY>",
            "appId": "<APP_ID>",
            "authDomain": "<PROJECT_ID>.firebaseapp.com",
            "measurementId": "<G-MEASUREMENT_ID>",
            "messagingSenderId": "<SENDER_ID>",
            "projectId": "<PROJECT_ID>",
            "storageBucket": "<PROJECT_ID>.appspot.com"
          }
        }
      }
      
  4. Sao chép các giá trị từ trong bản đồ value .
  5. Dán các giá trị này (cấu hình của bạn) vào tệp web/src/firebase-config.js của ứng dụng, như sau:

    firebase-config.js
    ...
    
    const config = {
      apiKey: "<API_KEY>",
      appId: "<APP_ID>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      measurementId: "<G-MEASUREMENT_ID>",
      messagingSenderId: "<SENDER_ID>",
      projectId: "<PROJECT_ID>",
      storageBucket: "<PROJECT_ID>.appspot.com",
    };
    
    ...
    

Khởi tạo Firebase trong ứng dụng của bạn

Cuối cùng, để khởi tạo Firebase, hãy nối thêm tệp web/src/index.js của ứng dụng của bạn với nội dung sau:

chỉ mục.js

...

const firebaseAppConfig = getFirebaseConfig();
initializeApp(firebaseAppConfig);

Hãy thử ứng dụng của bạn

Bây giờ mọi thứ đã được định cấu hình cho Firebase, bạn có thể dùng thử ứng dụng web chức năng của mình.

  1. Làm mới trình duyệt phục vụ ứng dụng của bạn.
  2. Bây giờ bạn có thể đăng nhập bằng Google và bắt đầu đăng tin nhắn vào cuộc trò chuyện. Nếu bạn có tệp hình ảnh, bạn thậm chí có thể tải chúng lên!

11. Sao chép cấu hình của bạn trên nhiều môi trường

Terraform vượt trội trong việc quản lý nhiều cơ sở hạ tầng có cấu hình tương tự (ví dụ: thiết lập dự án Firebase dàn dựng tương tự như dự án sản phẩm).

Trong lớp học lập trình này, bạn sẽ tạo dự án Firebase thứ hai làm môi trường chạy thử.

Để sao chép cấu hình hiện có nhằm tạo dự án dàn dựng này, bạn có hai tùy chọn:

  • Tùy chọn 1 : Tạo một bản sao cấu hình Terraform.
    Tùy chọn này mang lại sự linh hoạt nhất về mức độ khác biệt của dự án được sao chép so với dự án nguồn.
  • Tùy chọn 2 : Sử dụng lại cấu hình với for_each .
    Tùy chọn này cung cấp nhiều khả năng tái sử dụng mã hơn nếu mỗi dự án không có sự khác biệt đáng kể và bạn muốn phổ biến các thay đổi cho tất cả các dự án cùng một lúc.

Tùy chọn 1: Tạo bản sao cấu hình Terraform

Tùy chọn này mang lại sự linh hoạt nhất về mức độ khác biệt của dự án được sao chép so với dự án nguồn, chẳng hạn như có các ứng dụng có tên hiển thị khác nhau và triển khai theo giai đoạn.

  1. Ở thư mục gốc của thư mục web của bạn, hãy tạo một tệp cấu hình Terraform mới có tên main_staging.tf .
  2. Sao chép tất cả các khối tài nguyên từ tệp main.tf của bạn (ngoại trừ các khối terraformprovider ), sau đó dán chúng vào tệp main_staging.tf của bạn.
  3. Sau đó, bạn cần sửa đổi từng khối tài nguyên được sao chép trong main_staging.tf để chúng hoạt động với dự án dàn dựng của bạn:
    • Nhãn tài nguyên: Sử dụng tên mới để tránh xung đột. Ví dụ: đổi tên resource "google_project" "default" thành resource "google_project" "staging" .
    • Tài liệu tham khảo: Cập nhật từng tài liệu. Ví dụ: cập nhật google_firebase_project.default.project thành google_firebase_project.staging.project .
    Bạn có thể tìm thấy cấu hình đầy đủ của tệp main_staging.tf trong kho lưu trữ GitHub của lớp học lập trình này:

    web/terraform-checkpoints/replicate-config/main_staging-copypaste.tf

    Nếu bạn muốn sử dụng cấu hình này, hãy đảm bảo bạn thực hiện như sau:
    1. Sao chép cấu hình từ main_staging-copypaste.tf , sau đó dán nó vào tệp main_staging.tf của bạn.
    2. Trong tệp main_staging.tf của bạn, hãy làm như sau:
      • Trong khối tài nguyên google_project , hãy cập nhật thuộc tính name , thuộc tính project-id và (nếu bạn thiết lập Xác thực qua Terraform) thuộc tính billing_account bằng các giá trị của riêng bạn.
      • Trong khối tài nguyên google_firebase_web_app , hãy cập nhật thuộc tính display_name bằng giá trị của riêng bạn.
      • Trong khối tài nguyên google_firestore_databasegoogle_app_engine_application , hãy cập nhật thuộc tính location_id bằng giá trị của riêng bạn.
    main_staging.tf
    # Create a new Google Cloud project.
    resource "google_project" "staging" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_STAGING_PROJECT>"
      project_id      = "<PROJECT_ID_OF_STAGING_PROJECT"
      # Required if you want to set up Authentication via Terraform
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>"
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "staging_serviceusage" {
      provider = google-beta.no_user_project_override
    
      project = google_project.staging.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "staging_firebase" {
      provider = google-beta.no_user_project_override
    
      project = google_project.staging.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable Firebase services for the new project created above.
    resource "google_firebase_project" "staging" {
      provider = google-beta
    
      project = google_project.staging.project_id
    
      # Wait until the required APIs are enabled.
      depends_on = [
        google_project_service.staging_serviceusage,
        google_project_service.staging_firebase,
      ]
    }
    
    # Create a Firebase Web App in the new project created above.
    resource "google_firebase_web_app" "staging" {
      provider = google-beta
    
      project      = google_firebase_project.staging.project
      display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
      deletion_policy = "DELETE"
    }
    
  4. Chạy terraform apply để cung cấp dự án Firebase "dàn dựng" mới của bạn cũng như tất cả các tài nguyên của nó và kích hoạt các dịch vụ của nó.
  5. Xác minh rằng mọi thứ đã được cung cấp và kích hoạt như mong đợi bằng cách kiểm tra chúng trong bảng điều khiển Firebase như trước.

Tùy chọn 2: Sử dụng lại cấu hình với for_each

Tùy chọn này cung cấp nhiều khả năng tái sử dụng mã hơn nếu mỗi dự án không có sự khác biệt đáng kể và bạn muốn phổ biến các thay đổi cho tất cả các dự án cùng một lúc. Nó sử dụng đối số meta for_each trong ngôn ngữ Terraform.

  1. Mở tệp main.tf của bạn.
  2. Trong mỗi khối tài nguyên mà bạn muốn sao chép, hãy thêm đối số meta for_each , như sau:

    main.tf
    # Create new Google Cloud projects.
    resource "google_project" "default" {
      provider        = google-beta.no_user_project_override
      name            = each.value
      # Create a unique project ID for each project, with each ID starting with <PROJECT_ID>.
      project_id      = "<PROJECT_ID>-${each.key}"
      # Required if you want to set up Authentication via Terraform
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>"
    
      # Required for the projects to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    
      for_each = {
        prod    = "<PROJECT_NAME_OF_PROD_PROJECT>"
        staging = "<PROJECT_NAME_OF_STAGING_PROJECT>"
      }
    }
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "serviceusage" {
      provider = google-beta.no_user_project_override
      for_each = google_project.default
    
      project = each.value.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "firebase" {
      provider = google-beta.no_user_project_override
      for_each = google_project.default
    
      project = each.value.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable Firebase services for each of the new projects created above.
    resource "google_firebase_project" "default" {
      provider = google-beta
      for_each = google_project.default
    
      project = each.value.project_id
    
      depends_on = [
        google_project_service.serviceusage,
        google_project_service.firebase,
      ]
    }
    
    # Create a Firebase Web App in each of the new projects created above.
    resource "google_firebase_web_app" "default" {
      provider = google-beta
      for_each = google_firebase_project.default
    
      project      = each.value.project
      # The Firebase Web App created in each project will have the same display name.
      display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
      deletion_policy = "DELETE"
    }
    
    
    # NOTE: For this codelab, we recommend setting up Firebase Authentication
    # using the Firebase console. However, if you set up Firebase Authentication
    # using Terraform, copy-paste from your main.tf the applicable blocks.
    # Make sure to add the `for_each` meta-argument into each block.
    
    
    # Copy-paste from your main.tf file the applicable resource blocks
    # for setting up Cloud Firestore (including rules) and
    # for setting up Cloud Storage for Firebase (including rules).
    # Make sure to add the `for_each` meta-argument into each block.
    
    Bạn có thể tìm thấy cấu hình hoàn chỉnh của tệp main.tf sử dụng đối số meta for_each trong kho lưu trữ GitHub của lớp học lập trình này:

    web/terraform-checkpoints/replicate-config/main-foreach.tf

    Nếu bạn muốn sử dụng cấu hình này, hãy đảm bảo bạn thực hiện như sau:
    1. Sao chép cấu hình từ main-foreach.tf , sau đó dán nó vào tệp main.tf của bạn.
    2. Trong tệp main.tf của bạn, hãy làm như sau:
      • Trong khối tài nguyên google_project , hãy cập nhật thuộc tính name , thuộc tính project-id và (nếu bạn thiết lập Xác thực qua Terraform) thuộc tính billing_account bằng các giá trị của riêng bạn.
      • Trong khối tài nguyên google_firebase_web_app , hãy cập nhật thuộc tính display_name bằng giá trị của riêng bạn.
      • Trong google_firestore_databasegoogle_app_engine_application , hãy cập nhật các thuộc tính location_id với giá trị của riêng bạn.
  3. Thay vì áp dụng cấu hình này ngay lập tức, điều quan trọng là phải hiểu và khắc phục một vài điều về cách Terraform diễn giải cấu hình này so với cơ sở hạ tầng hiện có.
    1. Ngay bây giờ, nếu bạn áp dụng cấu hình này sử dụng for_each , các địa chỉ tài nguyên sẽ trông giống như sau:
      google_project.default["prod"]
      google_project.default["staging"]
      google_firebase_project.default["prod"]
      google_firebase_project.default["staging"]
      google_firebase_web_app.default["prod"]
      google_firebase_web_app.default["staging"]
      
      Tuy nhiên, dự án hiện tại mà bạn đã tạo trong phần đầu tiên của codelab này được biết là Terraform như sau:
      google_project.default
      google_firebase_project.default
      google_firebase_android_app.default
      
    2. Chạy terraform plan để xem những hành động mà Terraform sẽ thực hiện với trạng thái hiện tại.

      Đầu ra sẽ cho thấy rằng Terraform sẽ xóa dự án bạn đã tạo trong phần đầu tiên của codelab này và tạo hai dự án mới. Điều này là do Terraform không biết rằng dự án tại địa chỉ google_project.default đã được chuyển đến địa chỉ mới google_project.default["prod"] .
    3. Để khắc phục điều này, hãy chạy lệnh terraform state mv :
      terraform state mv "google_project.default" "google_project.default[\"prod\"]"
      
    4. Tương tự, để khắc phục tất cả các khối tài nguyên khác, chạy terraform state mv cho google_firebase_project , google_firebase_web_app và tất cả các khối tài nguyên khác trong tệp main.tf của bạn.
    5. Bây giờ, nếu bạn chạy terraform plan một lần nữa, nó không cho thấy rằng Terraform sẽ xóa dự án bạn đã tạo trong phần đầu tiên của codelab này.
  4. Chạy terraform apply để cung cấp dự án Firebase "dàn" mới của bạn và tất cả các tài nguyên của nó và cho phép các dịch vụ của nó.
  5. Xác minh rằng mọi thứ đã được cung cấp và bật như mong đợi bằng cách kiểm tra chúng trong bảng điều khiển Firebase như trước.

12. Bước thưởng: Triển khai các ứng dụng dàn dựng và sản phẩm của bạn

  1. Trong cơ sở mã của ứng dụng của bạn, hãy thay đổi firebase-config.js để sử dụng cấu hình firebase từ dự án dàn của bạn.

    Để nhắc nhở bản thân cách lấy cấu hình Firebase của bạn và thêm nó vào ứng dụng của bạn, hãy xem bước trước của codelab này, hãy thêm cấu hình firebase của bạn vào ứng dụng của bạn.
  2. Tại gốc của thư mục web của bạn, hãy chạy lệnh sau để triển khai ứng dụng của bạn vào dự án Firebase dàn dựng của bạn.
    firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
    
  3. Mở ứng dụng dàn của bạn trong trình duyệt thông qua URL được in trong đầu ra firebase deploy . Hãy thử đăng nhập, gửi tin nhắn và tải lên hình ảnh.

    Khi bạn triển khai một ứng dụng cho dự án Firebase, nó sử dụng tài nguyên Firebase thực sự, không phải là tài nguyên được mô phỏng. Khi bạn tương tác với ứng dụng dàn dựng của mình, bạn sẽ thấy dữ liệu và hình ảnh xuất hiện trong dự án dàn của bạn trong bảng điều khiển Firebase.
  4. Sau khi kiểm tra ứng dụng của bạn trong dàn dựng, hãy thay đổi firebase-config.js trở lại bằng cách sử dụng cấu hình firebase của dự án prod (dự án đầu tiên mà bạn tạo trong codelab này).
  5. Tại gốc của thư mục web của bạn, hãy chạy lệnh sau để triển khai ứng dụng của bạn cho dự án Firebase sản xuất của bạn.
    firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
    
  6. Mở ứng dụng sản xuất của bạn trong trình duyệt thông qua URL được in trong đầu ra firebase deploy . Hãy thử đăng nhập, gửi tin nhắn và tải lên hình ảnh.

    Bạn sẽ thấy dữ liệu và hình ảnh xuất hiện trong dự án sản xuất của bạn trong bảng điều khiển Firebase.
  7. Khi bạn tương tác xong với hai ứng dụng cho codelab này, bạn có thể ngăn chặn Firebase phục vụ chúng. Chạy lệnh sau cho mỗi dự án của bạn:
    firebase hosting:disable --project=<STAGING_PROJECT_ID>
    
    firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
    

13. Xin chúc mừng!

Bạn đã sử dụng Terraform để định cấu hình ứng dụng web trò chuyện thời gian thực! Và bạn đã theo dõi các thực tiễn tốt nhất cho môi trường phát triển bằng cách tạo các dự án Firebase riêng biệt để tổ chức và sản xuất.

Những gì chúng tôi đã đề cập

  • Sử dụng Terraform CLI để quản lý tài nguyên đám mây
  • Sử dụng Terraform để định cấu hình các sản phẩm Firebase (xác thực, Firestore, lưu trữ đám mây và quy tắc bảo mật)
  • Chạy và kiểm tra một ứng dụng web cục bộ bằng bộ trình giả lập cục bộ Firebase
  • Nhập Firebase vào một ứng dụng web
  • Sử dụng Terraform để sao chép cấu hình trên nhiều môi trường

Để biết thêm thông tin về Firebase và Terraform, hãy truy cập tài liệu của chúng tôi. Bạn có thể tìm thấy một danh sách tất cả các sản phẩm Firebase có hỗ trợ Terraform, Cấu hình Terraform mẫu cho các trường hợp sử dụng phổ biến và xử lý sự cố và Câu hỏi thường gặp hữu ích.