
AWS EC2とRDSのPostgreSQLを連携してビューを作成しようとした際に、次のエラーが発生した場合の解決策を紹介します。
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の権限がない場合、「許可を編集」をクリックし、下記のポリシーを追加します。
{
"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のエラーを解決する手順を紹介しました。
エラーの原因を求めるだけではなく、実際のコードや権限設定に関する解説も含めています。
問題解決の参考になれば幸いです。
- Original:https://minory.org/aws-ec2-secrets-manager-error.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...