programing

액세스 거부됨예외:사용자에게 다음을 수행할 권한이 없습니다: 람다:함수 호출

stoneblock 2023. 10. 11. 20:26

액세스 거부됨예외:사용자에게 다음을 수행할 권한이 없습니다: 람다:함수 호출

노드에서 람다 함수를 호출하려고 합니다.

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

문서와 여러 블로그를 읽었지만 이 사용자가 람다 함수를 호출할 수 있도록 권한을 부여할 수 없습니다.이 사용자가 람다를 호출하려면 어떻게 해야 합니까?

업데이트(TL;DR)

IAM Managed Policy(IAM 관리 정책)라는 이름도 있습니다.AWSLambdaRoleIAM 사용자 또는 IAM 역할에 할당할 수 있습니다.이렇게 하면 필요한 권한을 얻을 수 있습니다.


원답

AWSLambdaExecute그리고.AWSLambdaBasicExecutionRole오류로 표현되는 권한을 제공하지 않습니다.이러한 관리되는 정책은 모두 Lambda 함수 자체에 연결되도록 설계되어 있으므로 이러한 정책과 함께 실행됩니다.

이 오류는 nodejs 프로그램이 실행 중인 사용자에게 Lambda 기능을 시작할 권한이 없다는 것을 나타냅니다.

IAM 사용자에게 다음과 같은 정보를 제공해야 합니다.lambda:InvokeFunction권한:

  1. IAM Management Console(IAM 관리 콘솔)에서 사용자를 찾아 클릭합니다.
  2. "권한" 탭에서 "인라인 정책" 섹션을 펼치고 "여기 클릭" 링크를 클릭하여 정책을 추가합니다.
  3. "사용자 지정 정책"을 선택합니다.
  4. 정책 이름을 지정합니다.뭐든 될 수 있어요.
  5. 정책 문서 필드에 정책을 놓습니다.

샘플 정책:

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

저는 이 정책에 람다 메소드를 호출하는 두 가지 방법을 모두 포함시켰습니다.

서버리스 프레임워크를 사용하고 있는데 추가해야 했습니다.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

이 솔루션은 제게 효과적이었습니다.

  1. 정책 목록에서 AWSKeyManagementServicePowerUser 정책을 첨부하는 중(이 항목이 없으면 "iam:listRole"에서 오류가 발생함)

  2. 람다 추가:List @Matt Houser에서 정의한 사용자 지정 정책에 대한 기능을 나열합니다.

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

IAM으로 이동하여 사용자를 선택하고 "권한 추가"를 클릭합니다.권한 목록에서 람다를 사용하여 모든 정책을 검색하고 콘솔에서 람다를 실행하려면 원하는 정책을 선택하면 됩니다.

enter AWS IAM permissions

AWS가 제공하는 정책만 사용할 경우 사용자 또는 AWS가 속한 그룹에 제공해야 함

저는 이것을 더해서 해결했습니다.AWSLambdaFullAccess사용자에 대한 사용 권한

  1. IAM 사용자에서 권한 추가를 클릭합니다.
  2. "기존 정책 직접 연결"을 선택합니다.
  3. :AWSLambdaFullAccess한 후 합니다 합니다.next:review페이지 하단에
  4. .Add Permissions

그리고 그것으로 충분합니다.

효과가 있었습니다.

{
    "Sid": "PermissionToInvoke",
    "Effect": "Allow",
    "Action": [
      "lambda:InvokeFunction"
    ],
    "Resource": "arn:aws:lambda:*:*:*:*"
}

한 람다 함수가 다른 람다 함수를 호출할 수 있도록 하려면 람다 역할의 정책을 업데이트해야 합니다.

.Terraform예:

IAM 역할 및 정책 설정:

resource "aws_iam_role" "lambda_1_role" {
    name   = "Lambda_1_Role"
    assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Effect": "Allow",
            "Sid": ""
        }
    ]
}
EOF
}

IAM 정책 추가:

resource "aws_iam_policy" "iam_policy_for_lambda_1" {
    name         = "aws_iam_policy_for_terraform_aws_lambda_1_role"
    path         = "/"
    description  = "AWS IAM Policy for managing aws lambda 1 role"
    policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": "arn:aws:logs:*:*:*",
        "Effect": "Allow"
    },
    {
        "Sid": "Stmt1464440182000",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeAsync",
            "lambda:InvokeFunction"
        ],
        "Resource": [
            "*" 
        ]
    }
    ]
}
EOF
}

리소스를 지정하는 것도 잊지 마십시오.와일드카드를 제작에 사용하지 마십시오.

IAM 역할에 IAM 정책 첨부:

resource "aws_iam_role_policy_attachment" "attach_iam_policy_to_iam_role_lambda_1" {
    role        = aws_iam_role.lambda_1_role.name
    policy_arn  = aws_iam_policy.iam_policy_for_lambda_1.arn
}

람다 생성:

resource "aws_lambda_function" "lambda_1" {
    function_name  = "Lambda_1"
    filename       = "../lambda-1.zip"
    role           = aws_iam_role.lambda_1_role.arn
    handler        = "index.handler"
    runtime        = "nodejs16.x"
    depends_on     = [aws_iam_role_policy_attachment.attach_iam_policy_to_iam_role_lambda_1]
}

SAM 템플릿의 경우 AppSync 리소스에 람다 리소스를 추가했는지 확인합니다.

AppSyncApiServicePolicy:
Type: AWS::IAM::Policy
Properties:
  PolicyName: AppSyncLambdaInvokePolicy
  Roles:
    - !Ref AppSyncApiServiceRole
  PolicyDocument:
    Version: 2012-10-17
    Statement:
      - Effect: Allow
        Action: lambda:InvokeFunction
        Resource:
          - !GetAtt GetMessages.Arn // added lambda resource
          - !GetAtt SendMessage.Arn // added lambda resource

언급URL : https://stackoverflow.com/questions/37498124/accessdeniedexception-user-is-not-authorized-to-perform-lambdainvokefunction