【Node.js】AWS Lambda 関数呼び出しで発生する「AccessDeniedException」エラーを徹底解説!原因と解決策
Node.js で AWS Lambda 関数を呼び出す際に発生する「AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction」エラーの解決方法
Node.js で AWS Lambda 関数を呼び出す際に、以下のエラーが発生することがあります。
AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction
このエラーは、呼び出し元に Lambda 関数を呼び出す権限がないことを示しています。
原因
このエラーが発生する主な原因は以下の 2 つです。
- IAM ロールに Lambda 関数を呼び出す権限が付与されていない
- Node.js コードで IAM 認証情報が正しく設定されていない
解決策
以下の手順で、このエラーを解決することができます。
- IAM コンソールにアクセスします。
- 左側メニューから IAM を選択します。
- Lambda 関数を呼び出す Node.js アプリケーションで使用している IAM ロールを選択します。
- ロールのポリシー タブをクリックします。
- ポリシーの追加 をクリックします。
- Amazon Web Services タブを選択します。
- Lambda を選択します。
- アクション で InvokeFunction を選択します。
- リソース で、呼び出す Lambda 関数の ARN を選択します。
以下のコード例を確認し、ご自身のコードと比較してください。
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda({
region: 'YOUR_REGION',
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY',
});
const params = {
FunctionName: 'YOUR_LAMBDA_FUNCTION_NAME',
Payload: JSON.stringify({ message: 'Hello from Node.js!' }),
};
lambda.invoke(params, (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
上記のコード例で、以下の点に注意してください。
YOUR_REGION
を、ご自身の Lambda 関数がデプロイされているリージョンの値に置き換えます。YOUR_ACCESS_KEY_ID
とYOUR_SECRET_ACCESS_KEY
を、ご自身の IAM ユーザーのアクセスキー ID とシークレットキーに置き換えます。YOUR_LAMBDA_FUNCTION_NAME
を、呼び出す Lambda 関数の名前に置き換えます。
- セキュリティ上の理由から、IAM ユーザーには必要な権限のみを付与することが重要です。すべての AWS リソースへのアクセスを許可するポリシーは付与しないでください。
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda({
region: 'YOUR_REGION',
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY',
});
const params = {
FunctionName: 'YOUR_LAMBDA_FUNCTION_NAME',
Payload: JSON.stringify({ message: 'Hello from Node.js!' }),
};
lambda.invoke(params, (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
このコードを実行するには、以下の手順が必要です。
- Node.js と AWS SDK をインストールします。
- 上記のコードを
index.js
などのファイルに保存します。 - 以下のコマンドを実行して、コードを実行します。
node index.js
このコードを実行すると、以下の出力がコンソールに出力されます。
{
"StatusCode": 200,
"FunctionArn": "arn:aws:lambda:YOUR_REGION:YOUR_ACCOUNT_ID:function:YOUR_LAMBDA_FUNCTION_NAME",
"LogResult": "2024-07-11T15:49:46.657Z 42-123456789-0abcdef0-1234567890-example-function: Success",
"RequestId": "42-123456789-0abcdef0-1234567890-example-function",
"InvokedFunctionArn": "arn:aws:lambda:YOUR_REGION:YOUR_ACCOUNT_ID:function:YOUR_LAMBDA_FUNCTION_NAME",
"Payload": null
}
この出力は、Lambda 関数が正常に呼び出されたことを示しています。
AWS Lambda コンソールを使用して、Lambda 関数を直接呼び出すことができます。これを行うには、以下の手順が必要です。
- AWS マネジメントコンソールにアクセスします。
- サービス から Lambda を選択します。
- 呼び出す Lambda 関数を選択します。
- テスト タブをクリックします。
- テストイベント ペインで、Lambda 関数に渡すデータを入力します。
AWS CLI
AWS CLI を使用して、Lambda 関数をプログラムで呼び出すことができます。これを行うには、以下のコマンドを使用します。
aws lambda invoke \
--function-name YOUR_LAMBDA_FUNCTION_NAME \
--payload '{"message": "Hello from AWS CLI!"}'
API Gateway
API Gateway を使用して、HTTP リクエストを Lambda 関数にトリガーすることができます。これを行うには、以下の手順が必要です。
- API Gateway コンソールにアクセスします。
- REST API を作成します。
- リソース を作成します。
- Lambda 関数 をメソッドの統合先として選択します。
- デプロイ をクリックします。
他にも、Serverless Framework や Zappa などのツールを使用して、AWS Lambda 関数を呼び出すことができます。これらのツールは、Lambda 関数の開発とデプロイを簡略化することができます。
どの方法を選択するかは、要件によって異なります。
- シンプルで使い慣れた方法 を求めている場合は、AWS Lambda コンソールを使用するのがおすすめです。
- プログラムで Lambda 関数を呼び出し たい場合は、AWS CLI または API Gateway を使用する必要があります。
- Lambda 関数の開発とデプロイを簡略化 したい場合は、Serverless Framework などのツールを使用することができます。
node.js amazon-web-services aws-lambda