AWS lambda AccessDeniedException调用另一个lambda函数

时间:2017-12-28 21:23:15

标签: python amazon-web-services aws-lambda boto3 amazon-iam

在我的项目中,我在python代码中创建一个lambda函数,在一个方法中必须使用boto3调用另一个lambda函数。 在我的主要lambda中,我创建了这样的客户端:

client = boto3.client('lambda')

然后我以这种方式调用我的方法:

response = client.invoke(
            FunctionName='arn:aws:lambda:eu-west-1:1577:function:test',
            InvocationType='RequestResponse',
            LogType='None',
            Payload=json.dumps(d)
            )

但是当我测试我的主lambda控制台时返回此错误:

  

调用Invoke操作时发生错误(AccessDeniedException):User

我尝试在我的环境变量中设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY但是当我尝试保存时,返回此错误:

  

Lambda无法配置您的环境变量,因为您提供的环境变量包含当前不支持修改的保留键。此请求中使用的保留密钥:AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY

如何使用IAM用户在lambda中设置呼叫?

提前致谢

2 个答案:

答案 0 :(得分:6)

将Lambda调用权限附加到附加到父Lambda函数的现有IAM角色,而不是使用IAM用户。

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

const a int = int('a')
const z int = int('z')

const A int = int('A')
const Z int = int('Z')

func rot13(b int) int {

    isLower := b >= a && b <= z
    isUpper := b >= A && b <= Z

    if isLower {
        return a + ((b - a + 13) % 26)
    }

    if isUpper {
        return A + ((b - A + 13) % 26)
    }

    return b
}

func (rot *rot13Reader) Read(b []byte) (int, error) {
    n, err := rot.r.Read(b)
    if err == io.EOF {
        return 0, err
    }

    for x := range b {
        b[x] = byte(rot13(int(b[x])))
    }
    return n, err
}

func main() {
    s := strings.NewReader("Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

注意:您可以指定为资源调用的Lambda函数的ARN。

答案 1 :(得分:2)

如果可能,限制范围,以便呼叫者只能呼叫您的目标功能,而不是&#34; *&#34;允许它调用任何 lambda函数的资源。

{
   "Version": "2012-10-17",
   "Statement": [
    {
        "Sid": "InvokePermission",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": "arn:aws:lambda:eu-west-1:1577:function:test"
    }
  ]
}