AWS lambda FCM nodejs

AWS lamda 에서 FCM(Firebase Cloud Messaging)을 보내는 방법이다. 처음에는 npm install 한 모듈을 어떻게 aws에 추가하는지 몰라서 고생을 했는데, 단순히 모듈을 추가하고, 압축하여 layer 로 만들어서 사용하면 된다.

local PC 에서

  • 우선 임의 폴더를 만들고 디렉토리로 이동하여 패키지(firebase-admin)를 설치한다.

cd ~ && mkdir temp && cd temp
npm install firebase-admin
  • 동일한 디렉토리에서 이것을 다음과 같이 압축한다.(lambda_module 임의 이름이다. 아무거나 상관없음)

zip -r ../lambda_module.zip * 

firebase console 에서

lambda에서 firebase 를 호출하려면 firebase키가 필요한데, 공식가이드 문서(https://firebase.google.com/docs/cloud-messaging/auth-server?hl=ko) 에서 다운로드 받아 놓는다.

  • 대충 이런 모양의 파일(push admin key)

{
  "type": "service_account",
  "project_id": "XXXX",
  "private_key_id": "XXXXX",
  "private_key": "-----BEGIN PRIVATE KEY-----
  xxxx  
  -----END PRIVATE KEY-----\n",
  "client_email": "xxxx@xxxx.iam.gserviceaccount.com",
  "client_id": "9999999999",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-xxxx.iam.gserviceaccount.com"
}

AWS Console 에서

lambda layer 추가

  • 이제 aws console -> AWS Lambda 로 이동하여 레이어를 추가한다. Additional resources > Layers
  • Create Layer 버튼을 클릭하여 새로운 Layers 를 추가한다.
  • layers 이름과 설명 입력 후에
  • upload 버튼을 눌러서 위에서 압축한 lambda_module.zip 을 업로드 한다.
  • 업로드하면 ARN 명이 보일탠대, 그것을 메모장에 기입해 놓는다.(아래에서 바로 사용)

lambda funtion 추가

  • 이제 새로운 lambda 를 만들자
  • AWS Lambda > Funtions 메뉴 이동 후 Create Funtion 버튼클릭
  • 임의 Function name 과, Runtime에서는 nodejs 최신 버전으로 선택하고,
  • 위에서 생성한 Layers 부분에서 add Layer 버튼을 클릭하여 layer의 ARN 네임으로 추가한다.

권한

  • 일단 lambda 가 정상동작하려면 권한이 필요한대, 에러 메세지를 보고 lambda에 role을 부여하면 된다.
  • 아래 두개 role을 부여하면 실행하는데 문제가 없을 것이다.
AWSLambdaExecute
AWSLambdaBasicExecutionRole

Code Source

  • 이제 aws lambda 코드에서 테스트 이벤트 코드를 작성한다.
  • 코드 작성창 상단에 Test 버튼을 클릭하여 임의 이름으로 Test 코들르 작성하고 아래와 같이 이벤트를 입력하자

{
  "token": "수신 받을 firebase token",
  "topic": "push 메세지 제목",
  "contents": "push 내용"
}
  • 이제 왼쪽 창에서 key라는 폴더를 만들고, 하위에 push-admin-key.json 파일을 만들어 위에서 다운 받은 내용을 입력한다.
  • 이제 index.js 파일을 오픈하여, 아래와 같이 코드를 작성한다.

const admin = require('firebase-admin')
const serviceAccount = require("key/push-admin-key.json");  //위에서 사전에 발급받은 발송권한이 있는 키

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

exports.handler = async function(event) {
  const fcm_target_token = event.token;
  const topic = event.topic;
  const contents = event.contents;

  var fcm_message = {
    notification: {
      title: topic,
      body: contents
    },
    token: fcm_target_token
  };

  admin.messaging()
    .send(fcm_message)
    .then(function(response){
      console.log('보내기 성공 메시지:' + response);
    })
    .catch(function( error ){
      console.log('보내기 실패 메시지:' + error);
    }); 
}

Test

이제 코드 창 위의 Test 버튼을 클릭하면 사전에 정의된 Test 이벤트로 작동되여, 대상 폰으로 push 메세지가 온다.

마무리

이 lambda 를 적절한 위치에서 호출하거나 제어하면 어떤 프로그램이든 공통으로 사용할 수 있을 것이다. 예를 들면, email 과 대상 토큰을 매핑 시켜놓은 table을 만들고, 매개 변수로 email을 넣고, 이 lambda 함수에서 역으로 대상의 토큰을 추출하여 활용하는 방법이 있을 것이다.