web-dev-qa-db-ja.com

AccessDeniedException:ユーザーは実行を許可されていません:lambda:InvokeFunction

ノードからラムダ関数を呼び出そうとしています。

var aws = require('aws-sdk');
var lambda = new aws.Lambda({
    accessKeyId: 'id',
    secretAccessKey: 'key',
    region: 'us-west-2'
});

lambda.invoke({
    FunctionName: 'test1',
    Payload: JSON.stringify({
        key1: 'Arjun',
        key2: 'kom',
        key3: 'ath'
    })
}, function(err, data) {
    if (err) console.log(err, err.stack);
    else     console.log(data);
});

キーはIAMユーザー用です。ユーザーには、AWSLambdaExecuteおよびAWSLambdaBasicExecutionRoleポリシーが添付されています。

許可エラーが表示されます:AccessDeniedException: User: arn:aws:iam::1221321312:user/cli is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-west-2:1221321312:function:test1

私はドキュメントといくつかのブログを読みましたが、このユーザーにラムダ関数の呼び出しを許可することはできません。このユーザーにラムダを呼び出すにはどうすればよいですか?

ありがとう。

49
Arjun Komath

AWSLambdaExecuteおよびAWSLambdaBasicExecutionRoleは、エラーで表現されている許可を提供しません。これらの管理ポリシーはどちらもLambda関数自体にアタッチされるように設計されているため、これらのポリシーでは実行です。

エラーは、nodejsプログラムを実行しているユーザーにLambda関数を開始する権限がないことを示しています。

IAMユーザーにlambda:InvokeFunction権限を付与する必要があります。

  1. IAM管理コンソールでユーザーを見つけてクリックします。
  2. [アクセス許可]タブで、[インラインポリシー]セクションを展開し、[ここをクリック]リンクをクリックしてポリシーを追加します。
  3. 「カスタムポリシー」を選択します。
  4. ポリシーに名前を付けます。何でも構いません。
  5. このポリシーを[ポリシードキュメント]フィールドに配置します。

サンプルポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1464440182000",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeAsync",
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

このポリシーには、ラムダメソッドを呼び出すための両方のメソッドが含まれています。

更新:

IAMユーザーまたはIAMロールに割り当てることができるAWSLambdaRoleという名前のIAM管理ポリシーもあります。これにより、必要な権限が与えられます。

68
Matt Houser

サーバーレスフレームワーク を使用していますが、arn:aws:lambdaを使用するには、serverless.ymlのリソースとしてlambda.invokeも追加する必要がありました。

 iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
        - lambda:InvokeFunction # Added this like mentioned above
      Resource:
        - arn:aws:dynamodb:us-east-1:*:*
        - arn:aws:lambda:us-east-1:*:* # Had to add this too
5
Jessica Bee

このソリューションは私のために働いた:

  1. AWSKeyManagementServicePowerUserポリシーリストからのポリシー(それなしで「iam:listRole」でエラーが発生しました)

  2. @Matt Houserによって定義されたカスタムポリシーにlambda:ListFunctionsを追加する

    {「バージョン」:「2012-10-17」、「ステートメント」:[{「Sid」:「Stmt1464440182000」、「Effect」:「許可」、「アクション」:[「lambda:InvokeAsync」、「lambda:InvokeFunction "、" lambda:ListFunctions "]、"リソース ":[" * "]}]}

5
Ali Nem

AWSが提供するポリシーを使用する場合、それが属するユーザーまたはグループに与える必要があります Policy from AWS

iAMにアクセスして、ユーザーを選択し、アクセス許可の追加をクリックします。許可のリストでは、ラムダを使用してこれらのポリシーをすべて検索し、コンソールからラムダを実行するために必要なポリシーをチェックできます。 enter AWS IAM permissions

2
mykey

AWSLambdaFullAccessパーミッションをユーザーに追加することでこれを解決しました。

  1. IAMユーザー内で、アクセス許可の追加をクリックします
  2. 「既存のポリシーを直接添付する」を選択します
  3. AWSLambdaFullAccessを検索して選択し、ページの下部にあるnext:reviewをクリックします。
  4. Add Permissionsをクリックします

そして、それはそれを行う必要があります。

0
Enda Molloy