AWS Secrets ManagerをNode.jsで使用する際の問題解決方法

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 アカウント ID
  • SECRET_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: シークレット ID
  • YOUR_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 ManagerNode.js アプリケーションで使用する際、IAM ロールの設定、ネットワーク構成、SDK のバージョンなど複数のポイントを確認する必要があります。
本記事で紹介した問題解決手順を参考に、エラーの原因を特定し、解決してください。

Secrets Manager を活用することで、アプリケーションのセキュリティを大幅に向上させることができます。
正しく設定して、安全で効率的なシステムを構築しましょう。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA