FCM Lambda NodeJS
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 함수에서 역으로 대상의 토큰을 추출하여 활용하는 방법이 있을 것이다.
Read other posts