You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elastic Beanstalk部署的Django应用中配置GOOGLE_APPLICATION_CREDENTIALS

我来给你几个安全靠谱的方案,帮你搞定Firebase私钥在AWS Elastic Beanstalk上的部署和访问问题:

方案一:使用AWS Secrets Manager(最推荐)

Secrets Manager是AWS专门用来存储敏感信息的服务,自带加密、版本管理和自动轮换功能,安全性最高,也最易维护。

步骤1:上传Firebase私钥到Secrets Manager

  • 登录AWS控制台,打开Secrets Manager服务
  • 点击「存储新的密钥」,选择「其他类型的密钥」
  • 把Firebase私钥JSON的完整内容粘贴到「密钥值」区域,给这个密钥起个好记的名字(比如firebase-service-account),然后完成创建

步骤2:给Elastic Beanstalk实例角色添加权限

EB的EC2实例需要权限读取刚才创建的密钥:

  • 找到你的EB环境对应的IAM角色(通常名称以aws-elasticbeanstalk-ec2-role开头)
  • 给这个角色附加一个自定义IAM策略,允许它读取目标密钥,策略示例如下:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["secretsmanager:GetSecretValue"],
            "Resource": "arn:aws:secretsmanager:你的AWS区域:你的AWS账号ID:secret:firebase-service-account-xxxx"
        }
    ]
}

注意:替换上面的区域、账号ID和密钥ARN(可以从Secrets Manager的密钥详情页复制)

步骤3:修改Django代码读取密钥并初始化FCM

在Django的初始化逻辑里(比如wsgi.py、asgi.py或者单独的配置文件)添加代码,读取Secrets Manager的内容并初始化Firebase Admin:

import boto3
import json
import firebase_admin
from firebase_admin import credentials

def initialize_firebase():
    # 跳过重复初始化
    if firebase_admin._apps:
        return
    
    secret_name = "firebase-service-account"
    region_name = "你的AWS区域"

    # 初始化Secrets Manager客户端
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        # 获取密钥内容
        get_secret_value_response = client.get_secret_value(SecretId=secret_name)
        secret = get_secret_value_response['SecretString']
        service_account_info = json.loads(secret)
    except Exception as e:
        # 根据实际情况处理异常(比如权限不足、密钥不存在)
        raise RuntimeError(f"Failed to load Firebase service account: {str(e)}")

    # 初始化Firebase Admin
    cred = credentials.Certificate(service_account_info)
    firebase_admin.initialize_app(cred)

# 在Django启动时调用初始化函数
initialize_firebase()

记得把boto3添加到你的requirements.txt里,确保EB环境能安装它

方案二:使用S3存储私钥(备选)

如果不想用Secrets Manager,也可以把私钥存在私有S3桶里,配合IAM权限让EB实例读取。

步骤1:上传私钥到私有S3桶

  • 创建一个新的S3桶(默认就是私有访问权限,不要修改)
  • 上传Firebase私钥JSON文件,比如路径设为firebase/service-account.json

步骤2:给EB实例角色添加S3读取权限

给EB的EC2角色附加以下IAM策略,允许它读取目标文件:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:GetObject"],
            "Resource": "arn:aws:s3:::你的桶名/firebase/service-account.json"
        }
    ]
}

步骤3:修改Django代码从S3下载并初始化

import boto3
import os
import tempfile
import firebase_admin
from firebase_admin import credentials

def initialize_firebase():
    if firebase_admin._apps:
        return
    
    bucket_name = "你的S3桶名"
    file_key = "firebase/service-account.json"

    # 初始化S3客户端
    s3 = boto3.client('s3')

    # 创建临时文件存储私钥(实例重启后会自动删除)
    with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.json') as temp_file:
        s3.download_fileobj(bucket_name, file_key, temp_file)
        temp_file_path = temp_file.name

    # 设置环境变量让Firebase SDK读取
    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = temp_file_path

    # 初始化Firebase Admin
    cred = credentials.ApplicationDefault()
    firebase_admin.initialize_app(cred)

# 启动时初始化
initialize_firebase()
方案三:直接存入EB环境变量(不推荐)

虽然EB的环境变量是加密存储的,但私钥JSON内容较长,管理和维护起来比较麻烦,仅作为备选方案:

  • 打开EB控制台,进入你的环境→「配置」→「软件」
  • 在「环境属性」里添加变量FIREBASE_SERVICE_ACCOUNT,粘贴私钥JSON的完整内容
  • 修改Django代码读取变量并写入临时文件:
import os
import tempfile
import json
import firebase_admin
from firebase_admin import credentials

def initialize_firebase():
    if firebase_admin._apps:
        return
    
    service_account_json = os.environ.get('FIREBASE_SERVICE_ACCOUNT')
    if not service_account_json:
        raise ValueError("FIREBASE_SERVICE_ACCOUNT environment variable is missing")

    with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.json') as temp_file:
        temp_file.write(service_account_json)
        temp_file_path = temp_file.name

    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = temp_file_path
    cred = credentials.ApplicationDefault()
    firebase_admin.initialize_app(cred)

initialize_firebase()

内容的提问来源于stack exchange,提问作者Bigair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:52:46