ফায়ারবেস এখন টেরাফর্মকে সমর্থন করতে শুরু করেছে। আপনি যদি এমন কোনো দলে থাকেন যারা নির্দিষ্ট রিসোর্স প্রোভিশন এবং সার্ভিস এনাবল করে ফায়ারবেস প্রজেক্ট তৈরির প্রক্রিয়াকে স্বয়ংক্রিয় ও মানসম্মত করতে চান, তাহলে ফায়ারবেসের সাথে টেরাফর্ম ব্যবহার করা আপনার জন্য একটি ভালো সমাধান হতে পারে।
ফায়ারবেসের সাথে টেরাফর্ম ব্যবহারের মৌলিক কর্মপ্রবাহে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত রয়েছে:
একটি Terraform কনফিগারেশন ফাইল (
.tfফাইল) তৈরি এবং কাস্টমাইজ করা, যা আপনি যে ইনফ্রাস্ট্রাকচার প্রোভিশন করতে চান (অর্থাৎ, যে রিসোর্সগুলো প্রোভিশন করতে চান এবং যে সার্ভিসগুলো চালু করতে চান) তা নির্দিষ্ট করে।.tfফাইলে উল্লেখিত পরিকাঠামো প্রোভিশন করার জন্য Terraform-এর সাথে ইন্টারফেস করতে gcloud CLI কমান্ড ব্যবহার করা হয়।
টেরাফর্ম এবং ফায়ারবেস দিয়ে কী কী করা যায়?
এই গাইডের উদাহরণমূলক সাধারণ ওয়ার্কফ্লো হলো একটি অ্যান্ড্রয়েড অ্যাপসহ নতুন একটি ফায়ারবেস প্রজেক্ট তৈরি করা। কিন্তু আপনি টেরাফর্ম দিয়ে আরও অনেক কিছু করতে পারেন, যেমন:
টেরাফর্ম ব্যবহার করে বিদ্যমান পরিকাঠামো মুছে ফেলুন এবং পরিবর্তন করুন।
টেরাফর্ম ব্যবহার করে পণ্য-নির্দিষ্ট কনফিগারেশন ও কাজগুলো পরিচালনা করুন, যেমন:
- Firebase Authentication সাইন-ইন প্রোভাইডারগুলো সক্রিয় করা হচ্ছে।
- Cloud Storage বাকেট বা ডেটাবেস ইনস্ট্যান্স তৈরি করা এবং সেগুলোর জন্য Firebase Security Rules প্রয়োগ করা।
- Firebase App Hosting ব্যাকএন্ড, বিল্ড এবং অন্যান্য সম্পর্কিত রিসোর্স তৈরি করা।
এই সমস্ত কাজ সম্পন্ন করার জন্য আপনি স্ট্যান্ডার্ড টেরাফর্ম কনফিগারেশন ফাইল এবং কমান্ড ব্যবহার করতে পারেন। আর এই কাজে আপনাকে সাহায্য করার জন্য, আমরা কয়েকটি সাধারণ ব্যবহারের ক্ষেত্রের নমুনা টেরাফর্ম কনফিগারেশন ফাইল দিয়েছি।
ফায়ারবেসের সাথে টেরাফর্ম ব্যবহারের সাধারণ কর্মপ্রবাহ
পূর্বশর্ত
এই নির্দেশিকাটি ফায়ারবেসের সাথে টেরাফর্ম ব্যবহারের একটি ভূমিকা, তাই এটি টেরাফর্মে প্রাথমিক দক্ষতা আছে বলে ধরে নেয়। এই কার্যপ্রবাহটি শুরু করার আগে নিশ্চিত করুন যে আপনি নিম্নলিখিত পূর্বশর্তগুলি পূরণ করেছেন।
টেরাফর্ম ইনস্টল করুন এবং তাদের অফিসিয়াল টিউটোরিয়ালগুলো দেখে এর সাথে পরিচিত হন।
Google Cloud CLI ( gcloud CLI ) ইনস্টল করুন। একটি ইউজার অ্যাকাউন্ট অথবা একটি সার্ভিস অ্যাকাউন্ট ব্যবহার করে লগইন করুন।
- ব্যবহারকারী অ্যাকাউন্ট ব্যবহার করলে, আপনাকে অবশ্যই ফায়ারবেস পরিষেবার শর্তাবলী (Firebase ToS) মেনে নিতে হবে। আপনি যদি Firebase কনসোলে একটি ফায়ারবেস প্রজেক্ট দেখতে পারেন, তাহলে বুঝবেন আপনি ফায়ারবেস পরিষেবার শর্তাবলী মেনে নিয়েছেন।
- টেরাফর্মকে নির্দিষ্ট কিছু কাজ (যেমন, প্রজেক্ট তৈরি করা) করার জন্য, নিম্নলিখিত শর্তগুলো অবশ্যই পূরণ করতে হবে:
- ওই কাজগুলোর জন্য ব্যবহারকারী বা পরিষেবা অ্যাকাউন্টের প্রযোজ্য IAM অ্যাক্সেস থাকতে হবে।
- যদি ব্যবহারকারী বা পরিষেবা অ্যাকাউন্টটি কোনো Google Cloud সংস্থার অংশ হয়, তাহলে সংস্থার নীতিমালায় অবশ্যই অ্যাকাউন্টটিকে সেই কাজগুলো করার অনুমতি থাকতে হবে।
ধাপ ১: একটি Terraform কনফিগারেশন ফাইল তৈরি এবং কাস্টমাইজ করুন
একটি Terraform কনফিগারেশন ফাইলে দুটি প্রধান অংশ থাকে (যা নিচে বিস্তারিতভাবে বর্ণনা করা হলো):
- একটি
providerসেটআপ সেকশন যা নির্ধারণ করে কোন টেরাফর্ম রিসোর্সগুলো অ্যাক্সেস করা যাবে। - স্বতন্ত্র
resourceব্লকগুলির একটি অংশ যা নির্দিষ্ট করে দেয় কী ধরনের পরিকাঠামো তৈরি করতে হবে।
আপনার provider সেট আপ করুন
ফায়ারবেসের যে কোনো পণ্য বা পরিষেবা ব্যবহার করা হোক না কেন, একটি provider সেটআপ আবশ্যক।
আপনার লোকাল ডিরেক্টরিতে একটি Terraform কনফিগারেশন ফাইল (যেমন
main.tfফাইল) তৈরি করুন।এই নির্দেশিকায়, আপনি
providerসেটআপ এবং টেরাফর্মকে দিয়ে যে সমস্ত ইনফ্রাস্ট্রাকচার তৈরি করাতে চান, তা নির্দিষ্ট করার জন্য এই কনফিগারেশন ফাইলটি ব্যবহার করবেন। তবে মনে রাখবেন, প্রোভাইডার সেটআপটি কীভাবে অন্তর্ভুক্ত করবেন, তার জন্য আপনার কাছে বিভিন্ন বিকল্প রয়েছে।আপনার Terraform কনফিগারেশনের বাকি অংশে একটি
providerসেটআপ অন্তর্ভুক্ত করার জন্য নিম্নলিখিত বিকল্পগুলি রয়েছে:বিকল্প ১: এটিকে একটিমাত্র Terraform
.tfকনফিগারেশন ফাইলের শীর্ষে অন্তর্ভুক্ত করুন (যেমনটি এই নির্দেশিকায় দেখানো হয়েছে)।- আপনি যদি Terraform-এর ব্যবহার সবে শুরু করে থাকেন অথবা Firebase-এর সাথে Terraform ব্যবহার করে দেখতে চান, তাহলে এই বিকল্পটি ব্যবহার করুন।
বিকল্প ২: যে
.tfফাইলে আপনি তৈরি করার জন্য পরিকাঠামো নির্দিষ্ট করেন (যেমনmain.tfফাইল), সেটি থেকে আলাদা একটি.tfফাইলে (যেমনprovider.tfফাইল) এটিকে অন্তর্ভুক্ত করুন।- আপনি যদি একটি বৃহত্তর দলের অংশ হন এবং সেটআপকে প্রমিত করার প্রয়োজন হয়, তাহলে এই বিকল্পটি ব্যবহার করুন।
- টেরাফর্ম কমান্ড চালানোর সময়,
provider.tfএবংmain.tfউভয় ফাইলই অবশ্যই একই ডিরেক্টরিতে থাকতে হবে।
main.tfফাইলের শীর্ষে নিম্নলিখিতproviderসেটআপটি অন্তর্ভুক্ত করুন।আপনাকে অবশ্যই
google-betaপ্রোভাইডারটি ব্যবহার করতে হবে, কারণ এটি Terraform-এর সাথে Firebase ব্যবহারের একটি বিটা রিলিজ। প্রোডাকশনে ব্যবহারের সময় সতর্কতা অবলম্বন করুন।# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 6.0" } } } # Configures the provider to use the resource block's specified project for quota checks. provider "google-beta" { user_project_override = true } # Configures the provider to not use the resource block's specified project for quota checks. # This provider should only be used during project creation and initializing services. provider "google-beta" { alias = "no_user_project_override" user_project_override = false }
টেরাফর্ম ও ফায়ারবেস ব্যবহার করার সময় বিভিন্ন ধরণের প্রজেক্ট-সম্পর্কিত অ্যাট্রিবিউট (যার মধ্যে এই গাইডে উল্লিখিত "কোটা-চেক প্রজেক্ট"ও অন্তর্ভুক্ত) সম্পর্কে আরও জানুন।
আপনার কনফিগারেশন ফাইলটি সম্পূর্ণ করতে এবং কী ধরনের পরিকাঠামো তৈরি করতে চান তা নির্দিষ্ট করতে পরবর্তী বিভাগে যান।
resource ব্লক ব্যবহার করে কী পরিকাঠামো তৈরি করতে হবে তা নির্দিষ্ট করুন।
আপনার Terraform কনফিগারেশন ফাইলে (এই গাইডের জন্য, আপনার main.tf ফাইলে), আপনাকে সেই সমস্ত ইনফ্রাস্ট্রাকচার নির্দিষ্ট করতে হবে যা আপনি Terraform-কে দিয়ে তৈরি করাতে চান (অর্থাৎ, আপনি যে সমস্ত রিসোর্স প্রোভিশন করতে চান এবং যে সমস্ত সার্ভিস চালু করতে চান)। এই গাইডে, Terraform সাপোর্ট করে এমন সমস্ত Firebase রিসোর্সের একটি সম্পূর্ণ তালিকা খুঁজুন।
আপনার
main.tfফাইলটি খুলুন।providerসেটআপের অধীনে,resourceব্লকগুলোর নিম্নলিখিত কনফিগারেশন অন্তর্ভুক্ত করুন।এই সাধারণ উদাহরণটি প্রথমে একটি নতুন ফায়ারবেস প্রজেক্ট তৈরি করে এবং তারপর সেই প্রজেক্টের মধ্যে একটি ফায়ারবেস অ্যান্ড্রয়েড অ্যাপ তৈরি করে।
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { provider = google-beta.no_user_project_override name = "Project Display Name" project_id = "project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "default" { provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "default" { provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" package_name = "awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
রিসোর্স হিসেবে প্রজেক্ট এবং অ্যাপের পরিকাঠামোর সাথে যদি আপনি পরিচিত না হন, তাহলে নিম্নলিখিত ডকুমেন্টেশনটি পর্যালোচনা করুন:
- ফায়ারবেস প্রজেক্টগুলো বুঝুন
- ফায়ারবেস প্রজেক্ট ম্যানেজমেন্টের জন্য রেফারেন্স ডকুমেন্টেশন
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { # Use the provider that enables the setup of quota checks for a new project provider = google-beta.no_user_project_override name = "Project Display Name" // learn more about the project name project_id = "project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" // learn more about the Firebase-enabled label } } # Enables required APIs. resource "google_project_service" "default" { # Use the provider without quota checks for enabling APIS provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. # This action essentially "creates a Firebase project" and allows the project to use # Firebase services (like Firebase Authentication) and # Firebase tooling (like the Firebase console). # Learn more about the relationship between Firebase projects and Google Cloud. resource "google_firebase_project" "default" { # Use the provider that performs quota checks from now on provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. # Learn more about the relationship between Firebase Apps and Firebase projects. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" # learn more about an app's display name package_name = "awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
ধাপ ২: নির্দিষ্ট পরিকাঠামো তৈরি করতে Terraform কমান্ডগুলো চালান।
আপনার main.tf ফাইলে উল্লেখিত রিসোর্সগুলো সরবরাহ করতে এবং সার্ভিসগুলো চালু করতে, আপনার main.tf ফাইলের ডিরেক্টরি থেকেই নিম্নলিখিত কমান্ডগুলো চালান। এই কমান্ডগুলো সম্পর্কে বিস্তারিত তথ্যের জন্য Terraform ডকুমেন্টেশন দেখুন।
আপনি যদি এই ডিরেক্টরিতে প্রথমবারের মতো টেরাফর্ম কমান্ড চালান, তাহলে আপনাকে কনফিগারেশন ডিরেক্টরিটি ইনিশিয়ালাইজ করতে হবে এবং গুগল টেরাফর্ম প্রোভাইডারটি ইনস্টল করতে হবে। এটি করার জন্য নিম্নলিখিত কমান্ডটি চালান:
terraform init
নিম্নলিখিত কমান্ডটি চালিয়ে আপনার
main.tfফাইলে উল্লেখিত পরিকাঠামোটি তৈরি করুন:terraform apply
সবকিছু প্রত্যাশা অনুযায়ী সরবরাহ বা সক্রিয় করা হয়েছে কিনা তা নিশ্চিত করুন:
বিকল্প ১: নিম্নলিখিত কমান্ডটি চালিয়ে আপনার টার্মিনালে প্রিন্ট হওয়া কনফিগারেশনটি দেখুন:
terraform show
বিকল্প ২: Firebase কনসোলে আপনার Firebase প্রজেক্টটি দেখুন।
টেরাফর্ম সমর্থন সহ ফায়ারবেস রিসোর্স
নিম্নলিখিত Firebase এবং Google রিসোর্সগুলোতে Terraform সাপোর্ট রয়েছে। এবং আমরা প্রতিনিয়ত আরও রিসোর্স যোগ করছি! তাই আপনি যদি Terraform দিয়ে পরিচালনা করতে চান এমন রিসোর্সটি দেখতে না পান, তাহলে সেটি উপলব্ধ হয়েছে কিনা তা দেখতে শীঘ্রই আবার দেখুন অথবা GitHub রিপোজিটরিতে একটি ইস্যু ফাইল করে এর জন্য অনুরোধ করুন।
ফায়ারবেস প্রজেক্ট এবং অ্যাপ ম্যানেজমেন্ট
google_firebase_project— একটি বিদ্যমান Google Cloud প্রকল্পে ফায়ারবেস পরিষেবাগুলি সক্রিয় করুনফায়ারবেস অ্যাপস
-
google_firebase_apple_app— একটি ফায়ারবেস অ্যাপল প্ল্যাটফর্ম অ্যাপ তৈরি বা পরিচালনা করুন -
google_firebase_android_app— একটি ফায়ারবেস অ্যান্ড্রয়েড অ্যাপ তৈরি বা পরিচালনা করুন -
google_firebase_web_app— একটি ফায়ারবেস ওয়েব অ্যাপ তৈরি বা পরিচালনা করুন
-
Firebase Authentication
google_identity_platform_config— Google Cloud Identity Platform (GCIP) (যা Firebase Authentication ব্যাকএন্ড) সক্রিয় করুন এবং প্রোজেক্ট-স্তরের অথেনটিকেশন সেটিংস প্রদান করুন।টেরাফর্মের মাধ্যমে Firebase Authentication কনফিগার করতে GCIP সক্রিয় করা প্রয়োজন। Firebase Authentication কীভাবে সেট আপ করতে হয়, তা জানতে নমুনা
.tfফাইলটি পর্যালোচনা করে নিন।যে প্রজেক্টে Terraform GCIP এবং/অথবা Firebase Authentication চালু করবে, সেটিকে অবশ্যই Blaze প্রাইসিং প্ল্যানে থাকতে হবে (অর্থাৎ, প্রজেক্টটির সাথে একটি Cloud Billing অ্যাকাউন্ট যুক্ত থাকতে হবে)। আপনি
google_projectরিসোর্সেbilling_accountঅ্যাট্রিবিউট সেট করার মাধ্যমে প্রোগ্রাম্যাটিকভাবে এটি করতে পারেন।এই রিসোর্সটি আরও কনফিগারেশনের সুযোগ দেয়, যেমন লোকাল সাইন-ইন পদ্ধতি (অ্যানোনিমাস, ইমেল/পাসওয়ার্ড এবং ফোন অথেন্টিকেশন), সেইসাথে ব্লকিং ফাংশন এবং অনুমোদিত ডোমেইন।
google_identity_platform_default_supported_idp_config— গুগল, ফেসবুক বা অ্যাপলের মতো সাধারণ ফেডারেটেড আইডেন্টিটি প্রোভাইডারগুলো কনফিগার করুন।identity_platform_oauth_idp_config— যেকোনো OAuth আইডেন্টিটি প্রোভাইডার (IdP) উৎস কনফিগার করুনgoogle_identity_platform_inbound_saml_config— SAML ইন্টিগ্রেশন কনফিগার করুন
এখনো সমর্থিত নয়:
- টেরাফর্মের মাধ্যমে মাল্টি-ফ্যাক্টর অথেনটিকেশন (MFA) কনফিগার করা
Firebase App Hosting
google_firebase_app_hosting_backend— একটি Firebase App Hosting ব্যাকএন্ড তৈরি ও পরিচালনা করুন, যার মধ্যে নিরবচ্ছিন্ন ডেপ্লয়মেন্টের জন্য এর গিটহাব রিপোজিটরি সংযোগ এবং লাইভ ব্রাঞ্চ অন্তর্ভুক্ত।google_firebase_app_hosting_build— একটি নির্দিষ্ট কোডবেস রেফারেন্স ট্যাগ এবং সময়ে ব্যাকএন্ডের জন্য একটি বিল্ড তৈরি করে।google_firebase_app_hosting_traffic— একটি বিল্ড চালু করুন অথবা নিরবচ্ছিন্ন গিটহাব ডেপ্লয়মেন্ট কনফিগার করুন।
Firebase Data Connect
-
google_firebase_data_connect_service— একটি Data Connect সার্ভিস তৈরি করুন
Firebase Realtime Database
-
google_firebase_database_instance— একটি Realtime Database ইনস্ট্যান্স তৈরি করুন
এখনো সমর্থিত নয়:
- টেরাফর্মের মাধ্যমে Firebase Realtime Database Security Rules স্থাপন (প্রোগ্রামেটিক বিকল্প সহ অন্যান্য টুলিং ব্যবহার করে কীভাবে এই Security Rules স্থাপন করতে হয় তা জানুন)
Cloud Firestore
google_firestore_database— একটি Cloud Firestore ইনস্ট্যান্স তৈরি করুনgoogle_firestore_index— Cloud Firestore জন্য কার্যকর কোয়েরি সক্ষম করুনgoogle_firestore_document— কোনো কালেকশনের একটি নির্দিষ্ট ডকুমেন্ট দিয়ে একটি Cloud Firestore ইনস্ট্যান্সকে সিড করাগুরুত্বপূর্ণ: এই সিড ডকুমেন্টে প্রকৃত ব্যবহারকারী বা উৎপাদন সংক্রান্ত ডেটা ব্যবহার করবেন না।
Cloud Storage for Firebase
google_firebase_storage_bucket— একটি বিদ্যমান Cloud Storage বাকেটকে Firebase SDK, প্রমাণীকরণ, এবং Firebase Security Rules জন্য অ্যাক্সেসযোগ্য করে তুলুনgoogle_storage_bucket_object— Cloud Storage বাকেটে একটি অবজেক্ট যোগ করুনগুরুত্বপূর্ণ: এই ফাইলে প্রকৃত ব্যবহারকারী বা প্রোডাকশন ডেটা ব্যবহার করবেন না।
Firebase Security Rules ( Cloud Firestore এবং Cloud Storage জন্য)
উল্লেখ্য যে, Firebase Realtime Database তার Firebase Security Rules জন্য একটি ভিন্ন প্রোভিশনিং সিস্টেম ব্যবহার করে।
google_firebaserules_ruleset— একটি Cloud Firestore ইনস্ট্যান্স বা একটি Cloud Storage বাকেটের জন্য প্রযোজ্য Firebase Security Rules নির্ধারণ করুন।google_firebaserules_release— একটি Cloud Firestore ইনস্ট্যান্স বা Cloud Storage বাকেটে নির্দিষ্ট রুলসেট স্থাপন করুন
Firebase App Check
-
google_firebase_app_check_service_config— একটি সার্ভিসের জন্য App Check এনফোর্সমেন্ট সক্রিয় করুন -
google_firebase_app_check_app_attest_config— অ্যাপ অ্যাটেস্ট প্রোভাইডারের কাছে একটি অ্যাপল প্ল্যাটফর্ম অ্যাপ নিবন্ধন করুন -
google_firebase_app_check_device_check_config— DeviceCheck প্রোভাইডারের সাথে একটি Apple প্ল্যাটফর্ম অ্যাপ নিবন্ধন করুন -
google_firebase_app_check_play_integrity_config— প্লে ইন্টিগ্রিটি প্রোভাইডারের সাথে একটি অ্যান্ড্রয়েড অ্যাপ নিবন্ধন করুন -
google_firebase_app_check_recaptcha_enterprise_config— reCAPTCHA এন্টারপ্রাইজ প্রোভাইডারের সাথে একটি ওয়েব অ্যাপ নিবন্ধন করুন -
google_firebase_app_check_recaptcha_v3_config— reCAPTCHA v3 প্রোভাইডারের সাথে একটি ওয়েব অ্যাপ নিবন্ধন করুন -
google_firebase_app_check_debug_token— পরীক্ষার জন্য ডিবাগ টোকেন ব্যবহার করুন
Firebase Extensions
-
google_firebase_extensions_instance— একটি Firebase Extension ইনস্ট্যান্স ইনস্টল বা আপডেট করুন
সাধারণ ব্যবহারের জন্য নমুনা টেরাফর্ম কনফিগারেশন ফাইল
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটিকে একটি Cloud Billing অ্যাকাউন্টের সাথে যুক্ত করে (GCIP-এর সাথে Firebase Authentication জন্য Blaze প্রাইসিং প্ল্যানটি আবশ্যক), প্রজেক্টটির জন্য Firebase সার্ভিসগুলো সক্রিয় করে, GCIP-এর সাথে Firebase Authentication সেট আপ করে এবং প্রজেক্টটির সাথে তিন ধরনের অ্যাপ রেজিস্টার করে।
মনে রাখবেন যে, Terraform-এর মাধ্যমে Firebase Authentication সেট আপ করার জন্য GCIP সক্রিয় করা আবশ্যক।
# Creates a new Google Cloud project. resource "google_project" "auth" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "identitytoolkit.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "auth" { provider = google-beta project = google_project.auth.project_id depends_on = [ google_project_service.auth, ] } # Creates an Identity Platform config. # Also enables Firebase Authentication with Identity Platform in the project if not. resource "google_identity_platform_config" "auth" { provider = google-beta project = google_firebase_project.auth.project # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_phone_numbers = { "+11231231234" = "000000" } } } # Sets an SMS region policy. sms_region_config { allowlist_only { allowed_regions = [ "US", "CA", ] } } # Configures blocking functions. blocking_functions { triggers { event_type = "beforeSignIn" function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in" } forward_inbound_credentials { refresh_token = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_name = "My Web app" }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটির জন্য ফায়ারবেস সার্ভিসগুলো সক্রিয় করে এবং একটি Data Connect সার্ভিস প্রোভিশন করে।
# Creates a new Google Cloud project. resource "google_project" "dataconnect" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Data Connect). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.dataconnect.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedataconnect.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "dataconnect" { provider = google-beta project = google_project.dataconnect.project_id depends_on = [google_project_service.services] } # Create a Firebase Data Connect service resource "google_firebase_data_connect_service" "dataconnect-default" { project = google_firebase_project.dataconnect.project location = "name-of-region-for-service" service_id = "${google_firebase_project.dataconnect.project}-default-fdc" deletion_policy = "DEFAULT" }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটির জন্য ফায়ারবেস পরিষেবাগুলো সক্রিয় করে, প্রজেক্টটির ডিফল্ট Realtime Database ইনস্ট্যান্স প্রোভিশন করে এবং প্রজেক্টটির সাথে তিন ধরনের অ্যাপ রেজিস্টার করে।
# Creates a new Google Cloud project. resource "google_project" "rtdb" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" } # Enables required APIs. resource "google_project_service" "rtdb" { provider = google-beta.no_user_project_override project = google_project.rtdb.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb" { provider = google-beta project = google_project.rtdb.project_id depends_on = [google_project_service.rtdb] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb.project_id}-default-rtdb" type = "DEFAULT_DATABASE" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_name = "My Web app" }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটিকে একটি Cloud Billing অ্যাকাউন্টের সাথে যুক্ত করে (একাধিক Realtime Database ইনস্ট্যান্সের জন্য ব্লেজ প্রাইসিং প্ল্যান প্রয়োজন), প্রজেক্টটির জন্য ফায়ারবেস সার্ভিসগুলো সক্রিয় করে, একাধিক Realtime Database ইনস্ট্যান্স প্রোভিশন করে (প্রজেক্টটির ডিফল্ট Realtime Database ইনস্ট্যান্স সহ), এবং প্রজেক্টটির সাথে তিনটি ভিন্ন অ্যাপ টাইপ রেজিস্টার করে।
# Creates a new Google Cloud project. resource "google_project" "rtdb-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "rtdb-multi" { provider = google-beta.no_user_project_override project = google_project.rtdb-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id depends_on = [google_project_service.rtdb-multi] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb-multi.project_id}-default-rtdb" type = "DEFAULT_DATABASE" } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance. region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "name-of-additional-database-instance" type = "USER_DATABASE" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_firebase_project.rtdb-multi.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_firebase_project.rtdb-multi.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_firebase_project.rtdb-multi.project display_name = "My Web app" }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটির জন্য ফায়ারবেস পরিষেবাগুলো সক্রিয় করে, প্রজেক্টটির ডিফল্ট Cloud Firestore ইনস্ট্যান্সটি প্রোভিশন করে এবং প্রজেক্টটির সাথে তিন ধরনের অ্যাপ রেজিস্টার করে।
এটি ডিফল্ট Cloud Firestore ইনস্ট্যান্সের জন্য Firebase Security Rules প্রস্তুত করে, একটি Cloud Firestore ইনডেক্স তৈরি করে এবং সিড ডেটা সহ একটি Cloud Firestore ডকুমেন্ট যুক্ত করে।
# Creates a new Google Cloud project. resource "google_project" "firestore" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" } # Enables required APIs. resource "google_project_service" "firestore" { provider = google-beta.no_user_project_override project = google_project.firestore.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "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 } # Enables Firebase services for the new project created above. resource "google_firebase_project" "firestore" { provider = google-beta project = google_project.firestore.project_id depends_on = [google_project_service.firestore] } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_firebase_project.firestore.project name = "(default)" # See available locations: https://firebase.google.com/docs/firestore/locations location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_firestore_database.firestore.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") } } } # Releases 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_firestore_database.firestore.project } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_firestore_database.firestore.project collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } } # Adds a new Firestore document with seed data. # Don't use real end-user or production data in this seed document. resource "google_firestore_document" "doc" { provider = google-beta project = google_firestore_database.firestore.project collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_firebase_project.firestore.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_firebase_project.firestore.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_firebase_project.firestore.project display_name = "My Web app" }
এটি Cloud Firestore Security Rules সেট, যা firestore.rules নামের একটি স্থানীয় ফাইলে থাকা উচিত।
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, create, update: if request.auth != null; } } }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটিকে একটি Cloud Billing অ্যাকাউন্টের সাথে যুক্ত করে (অতিরিক্ত বাকেটের জন্য ব্লেজ প্রাইসিং প্ল্যান প্রয়োজন), প্রজেক্টটির জন্য ফায়ারবেস সার্ভিসগুলো সক্রিয় করে, অতিরিক্ত ও নন-ডিফল্ট Cloud Storage বাকেট প্রোভিশন করে এবং প্রজেক্টটির সাথে তিন ধরনের অ্যাপ রেজিস্টার করে।
এটি প্রতিটি Cloud Storage বাকেটের জন্য Firebase Security Rules সেট করে এবং Cloud Storage বাকেটগুলোর মধ্যে একটিতে একটি ফাইল আপলোড করে।
# Creates a new Google Cloud project. resource "google_project" "storage-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "storage-multi" { provider = google-beta.no_user_project_override project = google_project.storage-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "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 } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id depends_on = [google_project_service.storage-multi] } # Provisions a Cloud Storage bucket. resource "google_storage_bucket" "bucket-1" { provider = google-beta project = google_firebase_project.storage-multi.project name = "name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations location = "name-of-region-for-bucket" } # Provisions an additional Cloud Storage bucket. resource "google_storage_bucket" "bucket-2" { provider = google-beta project = google_firebase_project.storage-multi.project name = "name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the existing Storage bucket. location = "name-of-region-for-additional-bucket" } # Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-1" { provider = google-beta project = google_firebase_project.storage-multi.project bucket_id = google_storage_bucket.bucket-1.name } # Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-2" { provider = google-beta project = google_firebase_project.storage-multi.project bucket_id = google_storage_bucket.bucket-2.name } # Creates a ruleset of Firebase Security Rules from a local file. resource "google_firebaserules_ruleset" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.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") } } } # Releases the ruleset to the first Storage bucket. resource "google_firebaserules_release" "bucket-1" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-1.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_firebase_project.storage-multi.project } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-2" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-2.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_firebase_project.storage-multi.project } # Uploads a new file to the first Storage bucket. # Do not use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture-multi" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_storage_bucket.bucket-1.name } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project display_name = "My Web app" }
এটি Cloud Storage Security Rules সেট, যা storage.rules নামের একটি স্থানীয় ফাইলে থাকা উচিত।
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /some_folder/{fileName} { allow read, write: if request.auth != null; } } }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটির জন্য ফায়ারবেস সার্ভিসগুলো সক্রিয় করে এবং Cloud Firestore জন্য Firebase App Check প্রয়োগ সেট আপ ও সক্রিয় করে, যাতে এটি শুধুমাত্র আপনার অ্যান্ড্রয়েড অ্যাপ থেকেই অ্যাক্সেস করা যায়।
# Creates a new Google Cloud project. resource "google_project" "appcheck" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.appcheck.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseappcheck.googleapis.com", "firestore.googleapis.com", "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "appcheck" { provider = google-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project display_name = "Play Integrity app" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # Register the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটির জন্য ফায়ারবেস সার্ভিসগুলো সক্রিয় করে এবং প্রজেক্টটিতে একটি Firebase Extension নতুন ইনস্ট্যান্স ইনস্টল করে। যদি ইনস্ট্যান্সটি আগে থেকেই বিদ্যমান থাকে, তবে কনফিগারেশনে প্রদত্ত মানগুলোর উপর ভিত্তি করে এর প্যারামিটারগুলো আপডেট করা হয়।
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firebase.googleapis.com", "firebaseextensions.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "extensions" { provider = google-beta project = google_project.extensions.project_id depends_on = [ google_project_service.extensions, ] } # Installs an instance of the "Translate Text in Firestore" extension. # Or updates the extension if the specified instance already exists. resource "google_firebase_extensions_instance" "translation" { provider = google-beta project = google_firebase_project.extensions.project instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "ar,en,es,de,fr" INPUT_FIELD_NAME = "input" LANGUAGES_FIELD_NAME = "languages" OUTPUT_FIELD_NAME = "translated" } system_params = { "firebaseextensions.v1beta.function/location" = "us-central1" "firebaseextensions.v1beta.function/memory" = "256" "firebaseextensions.v1beta.function/minInstances" = "0" "firebaseextensions.v1beta.function/vpcConnectorEgressSettings" = "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED" } } }
এই কনফিগারেশনটি একটি নতুন Google Cloud প্রজেক্ট তৈরি করে, প্রজেক্টটির জন্য ফায়ারবেস এআই লজিক সহ ফায়ারবেস সার্ভিসগুলো সক্রিয় করে, এবং ফায়ারবেস এআই লজিকের জন্য Firebase App Check প্রয়োগ সেট আপ ও সক্রিয় করে, যাতে এটি শুধুমাত্র আপনার অ্যাপগুলো থেকেই অ্যাক্সেস করা যায়।
# Creates a new Google Cloud project. resource "google_project" "vertex" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for Vertex AI in Firebase). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.vertex.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase "aiplatform.googleapis.com", "firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse "firebaseappcheck.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "vertex" { provider = google-beta project = google_project.vertex.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Web App" } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Android App" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # Creates a Firebase Apple App in the new project created earlier. resource "google_firebase_apple_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Apple App" bundle_id = "bundle.id" team_id = "1234567890" } ### Protects Vertex AI in Firebase with App Check. # Turns on enforcement for Vertex AI in Firebase resource "google_firebase_app_check_service_config" "vertex" { provider = google-beta project = google_firebase_project.vertex.project service_id = "firebaseml.googleapis.com" enforcement_mode = "ENFORCED" } # Enables the reCAPTCHA Enterprise API resource "google_project_service" "recaptcha_enterprise" { provider = google-beta project = google_firebase_project.vertex.project service = "recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables the Play Integrity API resource "google_project_service" "play_integrity" { provider = google-beta project = google_firebase_project.vertex.project service = "playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Allows the web app to use reCAPTCHA Enterprise with App Check resource "google_firebase_app_check_recaptcha_enterprise_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_web_app.app.app_id site_key = "your site key" token_ttl = "7200s" # Optional depends_on = [google_project_service.recaptcha_enterprise] } # Registers the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_android_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = length(google_firebase_android_app.app.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } depends_on = [google_project_service.play_integrity] } # Registers the Apple app with the AppAttest provider resource "google_firebase_app_check_app_attest_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_apple_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = google_firebase_apple_app.app.team_id != "" error_message = "Provide a Team ID on the Apple App to use App Check" } } }
এই কনফিগারেশনটি দেখায় কিভাবে টেরাফর্ম ব্যবহার করে ম্যানুয়ালি একটি App Hosting ব্যাকএন্ড প্রোভিশন করতে হয়। এই পদ্ধতিটি আপনাকে তৈরি করা রিসোর্সগুলোর উপর সূক্ষ্ম নিয়ন্ত্রণ দেয়, কিন্তু এর জন্য আপনাকে প্রতিটি রিসোর্স আলাদাভাবে সংজ্ঞায়িত করতে হয়। যখন ডিফল্ট অপশনগুলোর বাইরে গিয়ে ব্যাকএন্ডটি কাস্টমাইজ করার প্রয়োজন হয়, তখন এটি কার্যকর।
# Creates a new Google Cloud project. resource "google_project" "apphosting" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase App Hosting). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.apphosting.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseapphosting.googleapis.com", "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "apphosting" { provider = google-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" service_account = google_service_account.service_account.email } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Creates a Build resource "google_firebase_app_hosting_build" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id build_id = "my-build" source { container { # TODO: use your own image image = "us-docker.pkg.dev/cloudrun/container/hello" } } } # Rolls out the Build resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id target { splits { build = google_firebase_app_hosting_build.example.name percent = 100 } } }
এই কনফিগারেশনটি দেখায় কিভাবে একটি গিটহাব রিপোজিটরিতে সংরক্ষিত অ্যাপ্লিকেশন কোড ব্যবহার করে একটি App Hosting ব্যাকএন্ড প্রোভিশন করতে হয়। এই পদ্ধতিটি আপনাকে App Hosting ডিপ্লয়মেন্টের সাধারণ মডেল অনুযায়ী গিটহাব পুল রিকোয়েস্ট এবং CI/CD পাইপলাইনের মাধ্যমে আপনার ইনফ্রাস্ট্রাকচার পরিচালনা ও আপডেট করার সুযোগ দেয়।
# Creates a new Google Cloud project. resource "google_project" "apphosting" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase App Hosting). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.apphosting.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseapphosting.googleapis.com", "serviceusage.googleapis.com", "developerconnect.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "apphosting" { provider = google-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } ### Setting up Firebase App Hosting ### # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" service_account = google_service_account.service_account.email codebase { repository = google_developer_connect_git_repository_link.my-repository.name root_directory = "/" } } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/developerconnect.readTokenAccessor", "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Configures auto rollout from GitHub resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id rollout_policy { codebase_branch = "main" # Or another branch } } ### ### Setting up a connection to GitHub ### # Provisions Service Agent for Developer Connect resource "google_project_service_identity" "devconnect-p4sa" { provider = google-beta project = google_firebase_project.apphosting.project service = "developerconnect.googleapis.com" } # Adds permission to Developer Connect Service Agent to manager GitHub tokens resource "google_project_iam_member" "devconnect-secret" { provider = google-beta project = google_firebase_project.apphosting.project role = "roles/secretmanager.admin" member = google_project_service_identity.devconnect-p4sa.member } # Connects to a GitHub account resource "google_developer_connect_connection" "my-connection" { provider = google-beta project = google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's location location = "name-of-region-for-service" # Must be `firebase-app-hosting-github-oauth` connection_id = "firebase-app-hosting-github-oauth" github_config { github_app = "FIREBASE" } depends_on = [google_project_iam_member.devconnect-secret] } # Follow the next steps to set up the GitHub connection # Tip: Run terraform refresh to obtain the output output "next_steps" { description = "Follow the action_uri if present to continue setup" value = google_developer_connect_connection.my-connection.installation_state } # Links a GitHub repo to the project resource "google_developer_connect_git_repository_link" "my-repository" { provider = google-beta project = google_firebase_project.apphosting.project location = google_developer_connect_connection.my-connection.location git_repository_link_id = "my-repo-id" parent_connection = google_developer_connect_connection.my-connection.connection_id clone_uri = "https://github.com/myuser/myrepo.git" } ###
সমস্যা সমাধান এবং প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
এই নির্দেশিকায় 'প্রজেক্ট' নিয়ে কাজ করার সময় নিম্নলিখিত টেরাফর্ম অ্যাট্রিবিউটগুলো ব্যবহার করা হয়।
- একটি
resourceব্লকের মধ্যেproject সুপারিশ: যখনই সম্ভব, প্রতিটি
resourceব্লকের মধ্যেprojectঅ্যাট্রিবিউট অন্তর্ভুক্ত করুন।প্রজেক্ট অ্যাট্রিবিউট অন্তর্ভুক্ত করার মাধ্যমে, টেরাফর্ম রিসোর্স ব্লকে উল্লেখিত ইনফ্রাস্ট্রাকচারটি নির্দিষ্ট প্রজেক্টের মধ্যে তৈরি করে। এই নির্দেশিকা এবং আমাদের নমুনা কনফিগারেশন ফাইলগুলো সবই এই পদ্ধতি অনুসরণ করে।
projectসম্পর্কে অফিসিয়াল টেরাফর্ম ডকুমেন্টেশন দেখুন।-
providerব্লকের মধ্যেuser_project_override বেশিরভাগ রিসোর্স প্রোভিশনিং করার জন্য, আপনার
user_project_override = trueব্যবহার করা উচিত, যার অর্থ হলো আপনার নিজের Firebase প্রজেক্টের বিপরীতে কোটা চেক করা। তবে, আপনার নতুন প্রজেক্টকে এমনভাবে সেট আপ করতে যাতে এটি কোটা চেক গ্রহণ করতে পারে, তার জন্য আপনাকে প্রথমেuser_project_override = falseব্যবহার করতে হবে।user_project_overrideসম্পর্কে জানতে টেরাফর্মের অফিসিয়াল ডকুমেন্টেশন দেখুন।
নিশ্চিত করুন যে, gcloud CLI কমান্ড চালানোর জন্য আপনি যে ইউজার অ্যাকাউন্টটি ব্যবহার করছেন, সেটি Firebase-এর পরিষেবার শর্তাবলী (Firebase ToS) গ্রহণ করেছে।
ব্যবহারকারী অ্যাকাউন্টে সাইন ইন করা একটি ব্রাউজার ব্যবহার করে এবং Firebase কনসোলে একটি বিদ্যমান ফায়ারবেস প্রজেক্ট দেখার চেষ্টা করে আপনি এই যাচাইটি করতে পারেন। যদি আপনি একটি বিদ্যমান ফায়ারবেস প্রজেক্ট দেখতে পান, তাহলে ব্যবহারকারী অ্যাকাউন্টটি ফায়ারবেসের পরিষেবার শর্তাবলী (ToS) গ্রহণ করেছে।
আপনি যদি কোনো বিদ্যমান ফায়ারবেস প্রজেক্ট দেখতে না পান, তাহলে সম্ভবত ব্যবহারকারী অ্যাকাউন্টটি ফায়ারবেসের ব্যবহারের শর্তাবলী (ToS) গ্রহণ করেনি। এটি ঠিক করতে, Firebase কনসোলের মাধ্যমে একটি নতুন ফায়ারবেস প্রজেক্ট তৈরি করুন এবং প্রজেক্ট তৈরির অংশ হিসেবে ফায়ারবেসের ব্যবহারের শর্তাবলী (ToS) গ্রহণ করুন। এরপর আপনি কনসোলের 'প্রজেক্ট সেটিংস' থেকে এই প্রজেক্টটি অবিলম্বে মুছে ফেলতে পারবেন।
কয়েক মিনিট অপেক্ষা করুন, এবং তারপর আবার terraform apply চালানোর চেষ্টা করুন।
বিভিন্ন সিস্টেমে প্রোপাগেশন ডিলে-র কারণে এমনটা হতে পারে। terraform import চালিয়ে রিসোর্সটিকে Terraform স্টেটে ইম্পোর্ট করে এই সমস্যাটি সমাধান করার চেষ্টা করুন। এরপর আবার terraform apply চালানোর চেষ্টা করুন।
আপনি প্রতিটি রিসোর্স কীভাবে ইম্পোর্ট করতে হয় তা তার Terraform ডকুমেন্টেশনের "Import" সেকশন থেকে শিখতে পারেন (উদাহরণস্বরূপ, Cloud Firestore এর "Import" ডকুমেন্টেশন )।
ত্রুটি বার্তা অনুযায়ী, টেরাফর্ম সম্ভবত একই সময়ে একাধিক ইনডেক্স প্রোভিশন করার এবং/অথবা একটি ডকুমেন্ট তৈরি করার চেষ্টা করতে গিয়ে একটি কনকারেন্সি এররের সম্মুখীন হয়েছে। terraform apply আবার চালানোর চেষ্টা করুন।
এই ত্রুটির অর্থ হলো, টেরাফর্ম জানে না কোন প্রজেক্টের জন্য কোটা পরীক্ষা করতে হবে। সমস্যা সমাধানের জন্য, resource ব্লকে নিম্নলিখিত বিষয়গুলো পরীক্ষা করুন:
- নিশ্চিত করুন যে আপনি
projectঅ্যাট্রিবিউটের জন্য একটি মান নির্দিষ্ট করেছেন। - নিশ্চিত করুন যে আপনি
user_project_override = true(কোনো অ্যালিয়াস ছাড়া) সহ প্রোভাইডারটি ব্যবহার করছেন, যা Firebase স্যাম্পলগুলোতেgoogle-beta।
প্রজেক্ট আইডিটি আগে থেকেই বিদ্যমান থাকার সম্ভাব্য কারণগুলো নিচে দেওয়া হলো:
ওই আইডিটির সাথে যুক্ত প্রকল্পটি অন্য কারো।
- সমাধান করতে: অন্য একটি প্রজেক্ট আইডি বেছে নিন।
ওই আইডিটির সাথে যুক্ত প্রজেক্টটি সম্প্রতি ডিলিট করা হয়েছে (সফট-ডিলিট অবস্থায়)।
- সমাধান করতে: যদি আপনার মনে হয় যে আইডিটির সাথে যুক্ত প্রজেক্টটি আপনার, তাহলে
projects.getREST API ব্যবহার করে প্রজেক্টটির অবস্থা যাচাই করুন।
- সমাধান করতে: যদি আপনার মনে হয় যে আইডিটির সাথে যুক্ত প্রজেক্টটি আপনার, তাহলে
ওই আইডিটির সাথে যুক্ত প্রজেক্টটি বর্তমান ব্যবহারকারীর অধীনে সঠিকভাবে বিদ্যমান আছে। এই ত্রুটির একটি সম্ভাব্য কারণ হতে পারে যে, পূর্ববর্তী কোনো
terraform applyবাধাগ্রস্ত হয়েছিল।- সমাধান করতে: নিম্নলিখিত কমান্ডগুলো চালান:
terraform import google_project.default PROJECT_IDএবং তারপর
terraform import google_firebase_project.default PROJECT_ID
- সমাধান করতে: নিম্নলিখিত কমান্ডগুলো চালান:
আপনি যদি আপনার ডিফল্ট Cloud Storage ফায়ারস্টোর ইনস্ট্যান্স প্রোভিশন করার চেষ্টা করার আগে আপনার ডিফল্ট Cloud Firestore স্টোরেজ বাকেট ( google_app_engine_application এর মাধ্যমে) প্রোভিশন করে থাকেন, তাহলে আপনি দেখতে পাবেন যে আপনার ডিফল্ট Cloud Firestore ইনস্ট্যান্সটি ইতিমধ্যেই প্রোভিশন করা হয়ে গেছে। মনে রাখবেন যে প্রোভিশন করা ডাটাবেস ইনস্ট্যান্সটি ডেটাস্টোর মোডে রয়েছে, যার মানে এটি ফায়ারবেস এসডিকে, অথেনটিকেশন বা Firebase Security Rules দ্বারা অ্যাক্সেসযোগ্য নয় । আপনি যদি এই ফায়ারবেস পরিষেবাগুলির সাথে Cloud Firestore ব্যবহার করতে চান, তাহলে আপনাকে ডাটাবেসটি খালি করতে হবে এবং তারপরে Google Cloud কনসোলে এর ডাটাবেস টাইপ পরিবর্তন করতে হবে।
যখন আপনি ( google_app_engine_application এর মাধ্যমে) কোনো প্রজেক্টের ডিফল্ট Cloud Storage বাকেট প্রোভিশন করেন এবং প্রজেক্টটির তখনও কোনো ডিফল্ট Cloud Firestore ইনস্ট্যান্স না থাকে, তখন google_app_engine_application স্বয়ংক্রিয়ভাবে প্রজেক্টটির ডিফল্ট Cloud Firestore ইনস্ট্যান্সটি প্রোভিশন করে দেয়।
সুতরাং, যেহেতু আপনার প্রোজেক্টের ডিফল্ট Cloud Firestore ইনস্ট্যান্সটি ইতিমধ্যেই প্রোভিশন করা আছে, আপনি যদি সেই ডিফল্ট ইনস্ট্যান্সটি আবার স্পষ্টভাবে প্রোভিশন করার চেষ্টা করেন, তাহলে google_firestore_database ত্রুটি দেখা দেবে।
একবার প্রোজেক্টের ডিফল্ট Cloud Firestore ইনস্ট্যান্স প্রোভিশন করা হয়ে গেলে, আপনি এটিকে "রি-প্রোভিশন" করতে বা এর অবস্থান পরিবর্তন করতে পারবেন না। মনে রাখবেন যে প্রোভিশন করা ডাটাবেস ইনস্ট্যান্সটি ডেটাস্টোর মোডে থাকে, যার মানে হলো এটি ফায়ারবেস এসডিকে, অথেনটিকেশন বা Firebase Security Rules দ্বারা অ্যাক্সেসযোগ্য নয় । আপনি যদি এই ফায়ারবেস পরিষেবাগুলির সাথে Cloud Firestore ব্যবহার করতে চান, তাহলে আপনাকে ডাটাবেসটি খালি করতে হবে এবং তারপরে Google Cloud কনসোলে এর ডাটাবেস টাইপ পরিবর্তন করতে হবে।