aws-sdk、firebase、firebase-admin はいずれもクラウドサービスと連携するためのnpmパッケージですが、用途と実行環境が大きく異なります。aws-sdk はAWSサービスを操作するための汎用クライアントライブラリで、主にNode.js環境で使用されます。firebase はWebやモバイルアプリからFirebaseサービス(Firestore、Authなど)に直接接続するためのクライアントSDKです。一方、firebase-admin はFirebaseプロジェクトをフルアクセス権限で操作するためのサーバーサイド専用ライブラリであり、クライアントコードに含めてはいけません。これらのパッケージは、認証モデル、セキュリティ要件、実行環境において根本的な違いを持っています。
フロントエンド開発者がクラウドサービスと連携する際、aws-sdk、firebase(クライアントSDK)、firebase-admin(Admin SDK)の3つのnpmパッケージがよく登場します。これらは目的や実行環境、セキュリティモデルが根本的に異なるため、混同すると重大な設計ミスにつながります。この記事では、実際のコードを交えながら、それぞれの役割と使いどころを明確にします。
aws-sdk(v2)は、AWSサービス(S3、DynamoDB、Lambdaなど)を操作するための汎用クライアントライブラリです。主にNode.js環境で使用されますが、ブラウザ向けの軽量版も提供されています。認証にはIAMロールやアクセスキーを使用し、サーバーサイドでの直接呼び出しが前提です。
// Node.js環境でのAWS SDK使用例(例:S3オブジェクト取得)
const AWS = require('aws-sdk');
const s3 = new AWS.S3({ region: 'ap-northeast-1' });
async function getObject(bucket, key) {
const params = { Bucket: bucket, Key: key };
return await s3.getObject(params).promise();
}
firebase(クライアントSDK)は、WebアプリからFirebaseサービス(Firestore、Auth、Storageなど)に直接接続するためのライブラリです。ブラウザやモバイルアプリなど、クライアントサイドでの使用を想定しています。セキュリティルール(Security Rules)によってデータアクセスを制御します。
// ブラウザでのFirebaseクライアント使用例(例:Firestoreドキュメント取得)
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore';
const app = initializeApp({
apiKey: "...",
authDomain: "...",
projectId: "..."
});
const db = getFirestore(app);
async function getUser(userId) {
const docRef = doc(db, 'users', userId);
const docSnap = await getDoc(docRef);
return docSnap.exists() ? docSnap.data() : null;
}
firebase-admin(Admin SDK)は、Firebaseプロジェクトをフルアクセス権限で操作するためのサーバーサイド専用ライブラリです。Node.js環境でのみ動作し、Firebase Authトークンの検証、Firestoreへの管理者権限での書き込み、Cloud Messagingの送信などが可能です。絶対にクライアントコードに含めてはいけません。
// Node.js環境でのFirebase Admin使用例(例:ユーザー情報取得)
const admin = require('firebase-admin');
admin.initializeApp({
credential: admin.credential.cert(serviceAccountKey)
});
async function getUser(uid) {
return await admin.auth().getUser(uid);
}
AWS SDKは、IAMポリシーを通じてリソースごとのアクセス権限を厳密に制御します。例えば、特定のS3バケットだけ読み取り可能にするなど、きめ細かい設定が可能です。ただし、クレデンシャル(アクセスキー)の管理が重要で、誤って公開すると重大なセキュリティリスクになります。
// IAMポリシー例(S3読み取り専用)
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::my-bucket/*"
}]
}
FirebaseクライアントSDKは、ユーザーの認証状態に基づいてFirestoreやStorageのデータアクセスを制御します。開発者はセキュリティルールを記述し、「ログイン済みユーザーのみ自分のデータにアクセス可能」などのルールを定義します。SDK自体は認証情報を自動で付与します。
// Firestoreセキュリティルール例
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Firebase Admin SDKは、Firebaseプロジェクトに対する完全な管理者権限を持ちます。セキュリティルールは無視され、すべてのデータに自由にアクセスできます。そのため、信頼できるサーバー環境(例:Cloud Functions、独自のNode.jsサーバー)でのみ使用すべきです。
// Admin SDKはセキュリティルールを無視して書き込み可能
await admin.firestore().collection('users').doc('any-user').set({
sensitiveData: '...' // セキュリティルールに関係なく書き込み成功
});
aws-sdk(v2)はモジュールが巨大で、ブラウザバンドルに含めるとサイズが膨大になります。公式ではブラウザ向けに軽量な@aws-sdk/client-*(v3)の使用を推奨しており、v2は非推奨ではありませんが新規プロジェクトではv3を検討すべきです。
firebase(クライアントSDK)はモジュール分割されており、必要な機能だけをインポートできます。たとえばAuthだけ使うならFirestoreのコードはバンドルされません。
// Firebase v9+のモジュール方式(最適化されたバンドル)
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
firebase-admin はNode.js専用で、依存関係も重いため、フロントエンドバンドルに絶対に含めてはいけません。APIキーだけでなく、秘密鍵(service account key)が漏洩する危険性があります。
// ❌ 絶対にやってはいけない例(フロントエンドコード内)
import admin from 'firebase-admin'; // バンドルに秘密鍵が含まれる!
回避策: フロントエンドからは常にfirebaseクライアントSDKを使い、管理者操作が必要な処理はCloud Functionsなどのバックエンド経由で実行します。
// ❌ 危険な例(ブラウザコード内)
const s3 = new AWS.S3({
accessKeyId: 'AKIA...', // 公開リポジトリに漏洩リスク
secretAccessKey: '...'
});
回避策: フロントエンドからAWSリソースにアクセスする場合は、Cognito Identity Pools経由で一時的な認証情報を取得するか、API Gateway + Lambdaを経由して間接的に操作します。
FirebaseクライアントSDKはセキュリティルールの範囲内でのみ動作するため、管理者権限が必要な操作(例:他のユーザーのトークン検証)はできません。
回避策: そのような操作は必ずFirebase Admin SDKをバックエンドで使用して実装します。
| シナリオ | 推奨パッケージ | 理由 |
|---|---|---|
| フロントエンドからFirebaseサービスに直接接続 | firebase | セキュリティルールと連携し、ユーザー認証情報を自動で扱える |
| バックエンドでFirebaseをフルコントロール | firebase-admin | 管理者権限でセキュリティルールを無視した操作が可能 |
| Node.jsサーバーからAWSサービスを操作 | aws-sdk (v2) または @aws-sdk/* (v3) | IAM認証で安全にAWSリソースを操作 |
| フロントエンドからAWSリソースにアクセス | 直接使用しない → API経由 | クレデンシャル漏洩リスクを回避 |
firebaseクライアントSDKのみを使用します。AWSやFirebase Adminの操作は、バックエンドAPIを介して間接的に行います。これらのパッケージは「同じクラウドサービス連携」という点で似ているように見えますが、実際には全く異なるレイヤーで動作します。目的と実行環境を明確にした上で選択することが、安全で効率的なアーキテクチャの第一歩です。
aws-sdk(v2)は、Node.jsサーバーやバックエンドサービスからAWSリソース(S3、DynamoDBなど)を直接操作する必要がある場合に選択します。ただし、ブラウザ向けアプリではバンドルサイズが大きくなるため、代わりに軽量なAWS SDK v3(@aws-sdk/client-*)の使用を検討すべきです。クレデンシャルの管理に注意し、フロントエンドコードにアクセスキーをハードコードしてはいけません。
firebase(クライアントSDK)は、WebアプリやモバイルアプリからFirebaseサービス(Firestore、Authentication、Storageなど)に直接接続する必要がある場合に選択します。ユーザー認証状態に基づくセキュリティルールと連携し、フロントエンドから安全にデータ操作を行えます。モジュール方式(v9+)を活用すれば、必要な機能だけをバンドルに含められます。
firebase-admin は、Firebaseプロジェクトを管理者権限で操作する必要があるサーバーサイド処理(例:ユーザー管理、プッシュ通知送信、セキュリティルールを無視したデータ操作)にのみ使用します。Node.js環境専用であり、絶対にフロントエンドバンドルに含めてはいけません。秘密鍵(service account key)が漏洩する重大なセキュリティリスクがあります。
The AWS SDK for JavaScript v2 has reached end-of-support on September 8, 2025. It will no longer receive updates or releases. Previously published versions are available on npm at aws-sdk, and source code remains on GitHub at aws/aws-sdk-js.
We recommend that you migrate to AWS SDK for JavaScript v3, which has been GA since December 2020. Here is why and how you should use it. You can try migration scripts in aws-sdk-js-codemod to migrate your application from v2 to v3.
To get help with your migration, please follow our general guidelines to open an issue. To give feedback on and report issues in the v3 repo, please refer to Giving feedback and contributing.
This SDK is distributed under the Apache License, Version 2.0, see LICENSE.txt and NOTICE.txt for more information.