Extend Remote Config with Cloud Functions

You can trigger a function in response to Remote Config events, including the publication of a new config version or the rollback to an older version. This guide describes how to create a Remote Config background function that performs a diff of two template versions.

Trigger a Remote Config function

To trigger a Remote Config function, first import the required modules:

Node.js

   
 // The Cloud Functions for Firebase SDK to set up triggers and logging. 
 const 
  
 { 
 onConfigUpdated 
 } 
  
 = 
  
 require 
 ( 
 "firebase-functions/v2/remoteConfig" 
 ); 
 const 
  
 logger 
  
 = 
  
 require 
 ( 
 "firebase-functions/logger" 
 ); 
 // The Firebase Admin SDK to obtain access tokens. 
 const 
  
 admin 
  
 = 
  
 require 
 ( 
 "firebase-admin" 
 ); 
 const 
  
 app 
  
 = 
  
 admin 
 . 
 initializeApp 
 (); 
 const 
  
 fetch 
  
 = 
  
 require 
 ( 
 "node-fetch" 
 ); 
 const 
  
 jsonDiff 
  
 = 
  
 require 
 ( 
 "json-diff" 
 ); 
  
 

Python

  # The Cloud Functions for Firebase SDK to set up triggers and logging. 
 from 
  
 firebase_functions 
  
 import 
 remote_config_fn 
 # The Firebase Admin SDK to obtain access tokens. 
 import 
  
 firebase_admin 
 app 
 = 
 firebase_admin 
 . 
 initialize_app 
 () 
 import 
  
 deepdiff 
 import 
  
 requests  
 
 

Then define a handler for the update event. The event object passed to this function contains metadata about a template update, such as the new version number and time of the update. You can also retrieve the email for the user who made the update, with name and an image if available.

Here's an example of a Remote Config function that logs a diff of each updated version and the version it replaced. The function examines the version number field of the template object and retrieves the current (newly updated) version together with the version one number lower:

Node.js

   
 exports 
 . 
 showconfigdiff 
  
 = 
  
 onConfigUpdated 
 ( 
 async 
  
 ( 
 event 
 ) 
  
 = 
>  
 { 
  
 try 
  
 { 
  
 // Obtain the access token from the Admin SDK 
  
 const 
  
 accessTokenObj 
  
 = 
  
 await 
  
 admin 
 . 
 credential 
 . 
 applicationDefault 
 () 
  
 . 
 getAccessToken 
 (); 
  
 const 
  
 accessToken 
  
 = 
  
 accessTokenObj 
 . 
 access_token 
 ; 
  
 // Get the version number from the event object 
  
 const 
  
 remoteConfigApi 
  
 = 
  
 "https://firebaseremoteconfig.googleapis.com/v1/" 
  
 + 
  
 `projects/ 
 ${ 
 app 
 . 
 options 
 . 
 projectId 
 } 
 /remoteConfig` 
 ; 
  
 const 
  
 currentVersion 
  
 = 
  
 event 
 . 
 data 
 . 
 versionNumber 
 ; 
  
 const 
  
 prevVersion 
  
 = 
  
 currentVersion 
  
 - 
  
 1 
 ; 
  
 const 
  
 templatePromises 
  
 = 
  
 []; 
  
 templatePromises 
 . 
 push 
 ( 
 fetch 
 ( 
  
 remoteConfigApi 
 , 
  
 { 
  
 method 
 : 
  
 "POST" 
 , 
  
 body 
 : 
  
 new 
  
 URLSearchParams 
 ([[ 
 "versionNumber" 
 , 
  
 currentVersion 
  
 + 
  
 "" 
 ]]), 
  
 headers 
 : 
  
 { 
 Authorization 
 : 
  
 "Bearer " 
  
 + 
  
 accessToken 
 }, 
  
 }, 
  
 )); 
  
 templatePromises 
 . 
 push 
 ( 
 fetch 
 ( 
  
 remoteConfigApi 
 , 
  
 { 
  
 method 
 : 
  
 "POST" 
 , 
  
 body 
 : 
  
 new 
  
 URLSearchParams 
 ([[ 
 "versionNumber" 
 , 
  
 prevVersion 
  
 + 
  
 "" 
 ]]), 
  
 headers 
 : 
  
 { 
 Authorization 
 : 
  
 "Bearer " 
  
 + 
  
 accessToken 
 }, 
  
 }, 
  
 )); 
  
 // Get the templates 
  
 const 
  
 responses 
  
 = 
  
 await 
  
 Promise 
 . 
 all 
 ( 
 templatePromises 
 ); 
  
 const 
  
 results 
  
 = 
  
 responses 
 . 
 map 
 (( 
 r 
 ) 
  
 = 
>  
 r 
 . 
 json 
 ()); 
  
 const 
  
 currentTemplate 
  
 = 
  
 results 
 [ 
 0 
 ]; 
  
 const 
  
 previousTemplate 
  
 = 
  
 results 
 [ 
 1 
 ]; 
  
 // Figure out the differences of the templates 
  
 const 
  
 diff 
  
 = 
  
 jsonDiff 
 . 
 diffString 
 ( 
 previousTemplate 
 , 
  
 currentTemplate 
 ); 
  
 // Log the difference 
  
 logger 
 . 
 log 
 ( 
 diff 
 ); 
  
 } 
  
 catch 
  
 ( 
 error 
 ) 
  
 { 
  
 logger 
 . 
 error 
 ( 
 error 
 ); 
  
 } 
 }); 
  
 

This sample uses the json-diff and request-promise modules to create the diff and build the request to get the template object.

Python

  @remote_config_fn 
 . 
 on_config_updated 
 () 
 def 
  
 showconfigdiff 
 ( 
 event 
 : 
 remote_config_fn 
 . 
 CloudEvent 
 [ 
 remote_config_fn 
 . 
 ConfigUpdateData 
 ]) 
 - 
> None 
 : 
  
 """Log the diff of the most recent Remote Config template change.""" 
 # Obtain an access token from the Admin SDK 
 access_token 
 = 
 app 
 . 
 credential 
 . 
 get_access_token 
 () 
 . 
 access_token 
 # Get the version number from the event object 
 current_version 
 = 
 int 
 ( 
 event 
 . 
 data 
 . 
 version_number 
 ) 
 # Figure out the differences between templates 
 remote_config_api 
 = 
 ( 
 "https://firebaseremoteconfig.googleapis.com/v1/" 
 f 
 "projects/ 
 { 
 app 
 . 
 project_id 
 } 
 /remoteConfig" 
 ) 
 current_template 
 = 
 requests 
 . 
 get 
 ( 
 remote_config_api 
 , 
 params 
 = 
 { 
 "versionNumber" 
 : 
 current_version 
 }, 
 headers 
 = 
 { 
 "Authorization" 
 : 
 f 
 "Bearer 
 { 
 access_token 
 } 
 " 
 }) 
 previous_template 
 = 
 requests 
 . 
 get 
 ( 
 remote_config_api 
 , 
 params 
 = 
 { 
 "versionNumber" 
 : 
 current_version 
 - 
 1 
 }, 
 headers 
 = 
 { 
 "Authorization" 
 : 
 f 
 "Bearer 
 { 
 access_token 
 } 
 " 
 }) 
 diff 
 = 
 deepdiff 
 . 
 DeepDiff 
 ( 
 previous_template 
 , 
 current_template 
 ) 
 # Log the difference 
 print 
 ( 
 diff 
 . 
 pretty 
 ()) 
  
 

This sample uses deepdiff to create the diff, and requests to build and send the request to get the template object.

Create a Mobile Website
View Site in Mobile | Classic
Share by: