无法使用本地设置中的 Python 代码在 AWS 中触发 Lambda 函数

问题描述 投票:0回答:2

我正在尝试使用 Python 代码触发 Lambda 函数,如下所示:

import boto3
from botocore.exceptions import NoCredentialsError, PartialCredentialsError

def get_lambda_client():
    return boto3.client('lambda')

def invoke_lambda():
    lambda_client = get_lambda_client()
    if lambda_client:
       try:
           response = lambda_client.invoke(
               FunctionName='MyLambdaFunctionName',
               InvocationType='RequestResponse',  # or 'event for async invocation'
               Payload=b'{}' #Not sending any payload
           )
           print(f" the response from the aws = {response}")
       except Exception as e:
           print(f" Error invoking Lambda function: {e}")

invoke_lambda()

我正在使用角色附加的以下策略:

  1. 触发 Lambda 函数的策略:

     {
       "Version": "2012-10-17",
       "Statement": [
         {
             "Effect": "Allow",
             "Action": "lambda:InvokeFunction",
             "Resource": "< arn of my lambda function>"
         },
         {
             "Effect": "Allow",
             "Action": "sts:AssumeRole",
             "Resource": "< arn of the role I created for lambda function which intern 
              will trigger aws step function>"
       }
      ]
    }
    
  2. 我为此 Lambda 函数触发器创建的角色的可信策略:

        {
          "Version": "2012-10-17",
          "Statement": [
             {
              "Effect": "Allow",
              "Principal": {
                  "Service": "lambda.amazonaws.com",
                  "AWS": "<arn for the iam user>"
                  },
              "Action": "sts:AssumeRole"
             }
           ]
         }
    

如果这里缺少任何内容,请告诉我。当我尝试从 python 代码触发 lambda 函数时遇到的错误是:

Error invoking Lambda function: An error occurred (ExpiredTokenException) when calling the Invoke operation: The security token included in the request is expired

考虑到我没有获取

AccessKey
SecreteKey
SessionToken
的权限,建议一个可以在此处使用的解决方案,可以通过假设 sts 角色来使用。

python python-3.x amazon-web-services aws-lambda amazon-iam
2个回答
2
投票

该过程应按如下方式进行:

  • 您的 Python 代码将需要使用 AWS 凭证来调用 AWS Lambda 函数。
    • 如果您从 Amazon EC2 实例运行 Python 代码,则它将使用分配给 Amazon EC2 实例的 IAM 角色中的凭证
    • 如果您从自己的计算机运行 Python 代码,则它将使用存储在本地 ~/.aws/credentials 配置文件中的
      IAM User
      凭证(通常使用 AWS CLI 中的
      aws configure
      命令创建)
  • 然后,Lambda 函数将自动承担已分配给 Lambda 函数的
  • IAM 角色。请注意,这是一个与您可能用来调用该函数的角色不同的 IAM 角色。 您的“触发 Lambda 函数的策略”不需要 AssumeRole 权限。它只需要调用 Lambda 函数的权限。

当您执行

2
投票
时,您将从环境变量

AWS_SESSION_TOKEN

 或从您的 
~/.aws/credentials
 文件中检索凭据。
您需要检查它,如果无法使用,请将其删除。

您的会话令牌似乎已过期,您需要使用 sts 重新生成一个新的会话令牌,如下所示:

boto3.client('sts').get_session_token()

请参阅 
boto3 文档

了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.