在我的项目中,我在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中设置呼叫?
提前致谢
答案 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"
}
]
}