AWS EC2とRDSのPostgreSQLを連携してビューを作成しようとした際に、次のエラーが発生した場合の解決策を紹介します。
1 |
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ロールを確認します。
下記の手順で確認できます。
- AWSマネジメントコンソールにログイン
- IAMダッシュボードに移動
- 相当するロールを選択
- 「Permissions」タブで「Secrets Managerの権限」が付与されているかを確認
ポリシーの追加
Secrets Managerの権限がない場合、「許可を編集」をクリックし、下記のポリシーを追加します。
1 2 3 4 5 6 7 8 9 10 |
{ "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のコード例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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のエラーを解決する手順を紹介しました。
エラーの原因を求めるだけではなく、実際のコードや権限設定に関する解説も含めています。
問題解決の参考になれば幸いです。
コメント