읽기 전

  • 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
  • 개인적으로 사용해보면서 배운 점을 정리한 글입니다.

이전 포스팅에서 Android에서의 Firebase Notification 수신 설정을 다루었다. 사이드 프로젝트에서 AWS Lambda 실행과 함께 Firebase Notification 전송을 요구받아 이번에 정리하려 한다.

Android에서 Firebase Notification 설정하기

참고 링크 - Android | Firebase Notification 설정하기

AWS Lambda에 firebase_admin 모듈 import하기

참고 링크 - Serverless | AWS Lambda Layer 외부 모듈 import하기

Firebase Service Account 정보 입력하기

Firebase Cloud Messaging 서비스를 이용하기 위해서 서비스 계정 정보가 필요하다. Google Cloud Function을 사용한다면 자동으로 지원하지만 외부 애플리케이션에 도입하는 케이스이기 때문이다. 프로젝트 설정 - 서비스 계정 탭에 접근하면 새 비공개 키 생성 버튼을 클릭하여 계정 정보가 기록된 json 파일을 다운받을 수 있다.

AWS_Lambda_Firebase_Notification_001

AWS_Lambda_Firebase_Notification_002

키 생성 버튼을 눌러 다운받자. 개인 프로젝트 정보가 기록된 파일이기 때문에 공개된 저장소에 저장하지 않도록 한다.

AWS_Lambda_Firebase_Notification_003

대충 이런식으로 기록되어 있다.

그러나 Lambda에서 Layer를 통해 일괄적으로 모듈을 관리할 수 있으나 개별 파일에 대해서는 관리가 어렵다. Layer에 json 파일을 넣어 Lambda 함수로 읽을 수 있는지 찾아봤지만 AWS 내부 엔진 경로와 관련된 문제로 보여 포기했다. 해당 파일을 읽어들이는 커스터마이징한 개인 모듈을 작성하는 방법을 사용할 수 있지만 귀찮음을 이유로 파일을 새로 추가하여 읽어오자.

AWS_Lambda_Firebase_Notification_004

위 사진처럼 Lambda Function Console에서는 File 탭을 클릭하여 새로운 파일을 생성할 수 있다. 앞서 다운받은 서비스 계정 정보가 기록된 json 파일의 내용을 복사하여 붙여넣는다.

AWS_Lambda_Firebase_Notification_005

붙여넣은 뒤 적당히 파일 이름을 정해 root 폴더를 클릭해 save를 해준다. 이렇게 저장하면 lambda_function.py에서 파일을 읽어올 때 경로를 상대경로로 접근할 수 있기에 편리하다.

이제 Firebase Notification을 전송할 python 코드를 작성한다.

import json
import firebase_admin
from firebase_admin import messaging
from firebase_admin import credentials

credential_file_path = './myfirebasenotification-53d66-firebase-adminsdk-ckyc6-dc3747fafa.json'

def send_fcm_update_notification():
    cred = credentials.Certificate(credential_file_path)
    try:
        push_service = firebase_admin.get_app()
    except:
        push_service = firebase_admin.initialize_app(cred)
    topic = "custom"
    message = messaging.Message(
        data = {
            'title': "앱 테스트 업데이트!",
            'body': "뭔지 모르지만 업데이트 하세!"
        },
        topic = topic)
    response = messaging.send(message)
    print(response)

def send_fcm_notify_notification():
    cred = credentials.Certificate(credential_file_path)
    try:
        push_service = firebase_admin.get_app()
    except:
        push_service = firebase_admin.initialize_app(cred)
    topic = "notify"
    message = messaging.Message(
        data = {
            'title': "앱 테스트 노티!",
            'body': "뭔지 모르지만 노티를 받으세!"
        },
        topic = topic)
    response = messaging.send(message)
    print(response)

def lambda_handler(event, context):
    send_fcm_update_notification()
    send_fcm_notify_notification()
    return

코드 작성 후 저장하여 테스트를 진행한다. 별도의 매개변수를 요구하지 않기 때문에 적당히 케이스를 생성하여 실행하자. 공식 문서 예제 코드에는 firebase_admin.initialize_app(cred)으로 적혀있지만 이미 생성되어 삭제되지 않고 남아있을 때 중복 키 오류를 출력하기 때문에 try문을 사용해 오류를 잡아준다.

AWS_Lambda_Firebase_Notification_006

아래 로그처럼 출력되면 Firebase Notification이 전송이 성공했음을 의미한다. 미리 안드로이드 AVD를 켜놓고 푸시알림 도달 여부를 기다리면 아래와 같이 의도한 대로 동작함을 확인할 수 있다.

AWS_Lambda_Firebase_Notification_007

+ Recent posts