サイトアイコン IT NEWS

AWS EC2でSecrets Managerの権限エラーを解決する方法

AWS EC2RDSPostgreSQLを連携してビューを作成しようとした際に、次のエラーが発生した場合の解決策を紹介します。

AccessDeniedException: User: arn:aws:sts::123456789012:assumed-role/role-name/i-instance-id is not authorized to perform: secretsmanager:GetSecretValue on resource: secret-arn because no identity-based policy allows the secretsmanager:GetSecretValue action

問題の原因

このエラーは、EC2のロールに「Secrets Managerからシークレットを取得する権限」が付与されていないことが原因です。
これにより、必要なデータを取得できず、その結果プログラム内でエラーが発生しています。

解決策

IAMロールの確認

一番初めに、EC2インスタンスに付与されているIAMロールを確認します。
下記の手順で確認できます。

  1. AWSマネジメントコンソールにログイン
  2. IAMダッシュボードに移動
  3. 相当するロールを選択
  4. 「Permissions」タブで「Secrets Managerの権限」が付与されているかを確認

ポリシーの追加

Secrets Managerの権限がない場合、「許可を編集」をクリックし、下記のポリシーを追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:region:account-id:secret:secret-id"
        }
    ]
}

ARNは、実際のSecrets ManagerシークレットのARNに置き換えてください。

Secrets Managerからの取得コード

権限設定を確認したら、Secrets Managerからシークレットを取得する部分を確認します。
以下はNode.jsのコード例です。

const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();

async function getSecretValue(secretName) {
  const data = await secretsManager.getSecretValue({ SecretId: secretName }).promise();
  if ('SecretString' in data) {
    return JSON.parse(data.SecretString);
  }
  throw new Error('Secret not found');
}

// 例の実行
getSecretValue('my-secret-id').then(secret => {
  console.log(secret);
}).catch(err => {
  console.error(err);
});

このコードを使用することで、Secrets Managerからシークレットを取得できます。

まとめ

この記事では、AWS EC2インスタンスからSecrets Managerエラーを解決する手順を紹介しました。
エラーの原因を求めるだけではなく、実際のコードや権限設定に関する解説も含めています。
問題解決の参考になれば幸いです。

モバイルバージョンを終了