AWS Secrets Manager を使用して、Node.js アプリケーションからシークレット(データベース接続情報や API キーなど)を安全に取得する方法について解説します。
この記事では、シークレット取得時に発生する可能性のある問題の原因と対処法を詳しく説明し、実装例を紹介します。
よくあるエラーと原因
Node.js アプリケーションで AWS Secrets Manager を使用する際に、以下のようなエラーが発生することがあります。
エラーメッセージ例
Error: Missing credentials in config
AccessDeniedException: User is not authorized to perform secretsmanager:GetSecretValue
TimeoutError: The connection to the Secrets Manager endpoint timed out
これらのエラーの主な原因と解決方法を以下にまとめました。
問題解決手順
IAMロールとポリシーの確認
Secrets Manager からシークレットを取得するには、適切な IAM ロールとポリシーが必要です。
必要なポリシーの例
IAM ロールに以下のようなポリシーが設定されていることを確認してください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:REGION:ACCOUNT_ID:secret:SECRET_NAME" } ] }
REGION
: 使用している AWS リージョン(例:ap-northeast-1
)ACCOUNT_ID
: AWS アカウント IDSECRET_NAME
: シークレット名
IAM ロールが EC2 インスタンスにアタッチされているか確認
AWS Management Console または以下のコマンドで確認できます。
curl http://169.254.169.254/latest/meta-data/iam/info
このコマンドを実行すると、アタッチされている IAM ロールの情報が表示されます。
Secrets Manager へのアクセス確認
Secrets Manager への接続が正しく機能しているかを確認するには、AWS CLI を使用します。
AWS CLI での確認
以下のコマンドを EC2 インスタンス上で実行します。
aws secretsmanager get-secret-value --secret-id YOUR_SECRET_ID --region YOUR_REGION
YOUR_SECRET_ID
: シークレット IDYOUR_REGION
: AWS リージョン(例:ap-northeast-1
)
シークレットが正しく取得できれば、CLI 経由でのアクセスに問題はありません。
Node.js アプリケーションのコード確認
Node.js で AWS SDK を使用して Secrets Manager からシークレットを取得するコードの例を以下に示します。
実装例
const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); async function getSecret() { const region = "ap-northeast-1"; // 使用しているリージョンを指定 const secretId = "your-secret-id"; // シークレットの ID を指定 // Secrets Manager クライアントの初期化 const smClient = new SecretsManagerClient({ region }); try { // シークレットの取得 const command = new GetSecretValueCommand({ SecretId: secretId, VersionStage: "AWSCURRENT", // 最新バージョンを指定 }); const response = await smClient.send(command); // シークレットの値をパースして返却 return JSON.parse(response.SecretString); } catch (error) { console.error("Error retrieving secret:", error); throw error; // エラーを再スロー } } // 使用例 getSecret() .then(secret => console.log("Retrieved secret:", secret)) .catch(error => console.error("Failed to retrieve secret:", error));
解説
SecretsManagerClient
を初期化する際に、AWS リージョンを指定します。GetSecretValueCommand
を使用して、指定したシークレット ID の値を取得します。- エラーが発生した場合に備えて、
try-catch
ブロックで詳細なエラーメッセージを出力します。
AWS SDK のバージョン確認
AWS SDK のバージョンが古いと、最新の API に対応していない可能性があります。
以下のコマンドで最新バージョンをインストールしてください。
npm install @aws-sdk/client-secrets-manager@latest
ネットワーク接続の確認
Secrets Manager は AWS のエンドポイントを使用するため、ネットワーク接続が適切に構成されている必要があります。
確認ポイント
- EC2 インスタンスがインターネットに接続されているか、または VPC エンドポイントが設定されているか。
- セキュリティグループやネットワーク ACL が Secrets Manager のエンドポイント(443 ポート)へのアクセスを許可しているか。
6. 環境変数の設定
Node.js アプリケーションで AWS SDK を使用する際、環境変数を適切に設定する必要があります。
必要な環境変数
export AWS_REGION="ap-northeast-1" export AWS_ACCESS_KEY_ID="your-access-key-id" export AWS_SECRET_ACCESS_KEY="your-secret-access-key"
まとめ
AWS Secrets Manager を Node.js アプリケーションで使用する際、IAM ロールの設定、ネットワーク構成、SDK のバージョンなど複数のポイントを確認する必要があります。
本記事で紹介した問題解決手順を参考に、エラーの原因を特定し、解決してください。
Secrets Manager を活用することで、アプリケーションのセキュリティを大幅に向上させることができます。
正しく設定して、安全で効率的なシステムを構築しましょう。
- Original:https://minory.org/aws-secrets-manager-node-error.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...