【问题标题】:AWS IAM role permissions in Lambda is not able to find the Amazon S3 urlLambda 中的 AWS IAM 角色权限无法找到 Amazon S3 url
【发布时间】:2020-10-08 06:02:53
【问题描述】:

我正在执行以下 AWS Lambda 函数:

import json
import urllib.parse
import boto3

print('Loading function')

s3 = boto3.client('s3')
transcribe = boto3.client('transcribe') 
#DOCUMENTATION : https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/transcribe.html#TranscribeService.Client.start_transcription_job


def lambda_handler(event, context):
    
    
    # 1 - Get the bucket name
    bucket = event['Records'][0]['s3']['bucket']['name']

    # 2 - Get the file/key name
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    media_uri = "s3://aws-support-ml-demo-bucket/SampleInboundCall2.mp3"
    
    try:
        response = transcribe.start_transcription_job(
        TranscriptionJobName='thisjobiscomming-from-lambda',
        LanguageCode='en-US',
        MediaSampleRateHertz=8000,
        MediaFormat='mp3',
        Media={
            'MediaFileUri': media_uri
        },
        OutputBucketName='aws-support-ml-demo-bucket-transcribe',
        # OutputEncryptionKMSKeyId='string',
        Settings={
           
            'ShowSpeakerLabels': True,
            'MaxSpeakerLabels': 3,
            'ChannelIdentification': False,
           
            'ShowAlternatives': False,
            
        },
        JobExecutionSettings={
            'AllowDeferredExecution': True,
        
            'DataAccessRoleArn': 'arn:aws:iam::026863910802:role/service-role/TEST-AWS-TEST'
        },
        ContentRedaction={
            'RedactionType': 'PII',
            'RedactionOutput': 'redacted'
        }
        
    )
        print(response)
       

    except Exception as e:
        print(e)
        raise e

有错误:

2020-06-18T11:18:17.628+03:00
An error occurred (BadRequestException) when calling the StartTranscriptionJob operation: The S3 URI that you provided can't be accessed. Make sure that you have read permission and try your request again.

2020-06-18T11:18:17.628+03:00
[ERROR] BadRequestException: An error occurred (BadRequestException) when calling the StartTranscriptionJob operation: The S3 URI that you provided can't be accessed. Make sure that you have read permission and try your request again.
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 63, in lambda_handler
    raise e
  File "/var/task/lambda_function.py", line 24, in lambda_handler
    response = transcribe.start_transcription_job(

存储桶名称为aws-support-ml-demo-bucket,文件直接位于存储桶内。 我的 lambda 角色还可以完全访问 S3。

我没有太多使用 S3 url 的经验,但我认为这可能是问题所在。

关于 IAM 角色,我在 lambda 执行和 lambda 中使用完全相同的一个角色进行转录:

'DataAccessRoleArn': 'arn:aws:iam::026863910802:role/service-role/TEST-AWS-TEST'

该角色具有以下权限:

AmazonS3FullAccess
AWS managed policy

AmazonTranscribeFullAccess
AWS managed policy

IAMassumeRole
Managed policy

AWSLambdaS3ExecutionRole-6fe39002-b20d-4255-a666-98fb5c889b2c
Managed policy

AWSLambdaBasicExecutionRole-9da5b8ab-3601-4975-ad97-1206e6348784
Managed policy

【问题讨论】:

  • 您拥有aws-support-ml-demo-bucket 存储桶吗?我无法访问它或 mp3 文件,因此它不是公共存储桶。
  • 嘿,约翰,我只是设法通过删除 lambda 的这一部分来让它工作:JobExecutionSettings: {....} 出于某种原因。我无法解释为什么与 DataAccessRoleARN 有冲突……很奇怪
  • 最初,我认为问题出在 media_uri 上,但事实证明没关系。桶是不公开的......这是正确的。感谢大家的帮助,我真的很感激。希望这对将来的其他人有所帮助。 :)

标签: amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

我的 lambda 角色也可以完全访问 s3。

我认为问题在于不在于 lambda 执行角色,而在于:

'DataAccessRoleArn': 'arn:aws:iam::026863910802:role/service-role/TEST-AWS-TEST'

这应该是Job Queuing 的角色,具有transcribe.amazonaws.com 的信任策略。

这个角色应该有权读取您的 s3 对象,而不是 lambda 函数的执行角色。

来自docs

DataAccessRoleArn:具有对包含输入文件的 S3 存储桶的访问权限的角色的 Amazon 资源名称 (ARN)。 Amazon Transcribe 代入此角色以读取排队的媒体文件。如果您已为转录结果指定了输出 S3 存储桶,则此角色也应有权访问输出存储桶。

【讨论】:

  • 我明白你的意思 Marcin,但是,我实际上对两者使用相同的角色。此角色具有以下访问权限:AmazonS3FullAccess AWS 托管策略 AmazonTranscribeFullAccess AWS 托管策略 IAMassumeRole 托管策略
  • @Etika49 您能否在问题中发布这两个角色及其政策和信任关系?
  • 添加了数据。为了简单起见,我使用相同的角色。
【解决方案2】:

您也可以尝试通过传递区域(us-east-1)来创建 S3 客户端。另请检查您的 lambda 是否在 VPC 内。如果它在 VPC 内部。您可能需要路由或 VPC 终端节点才能连接到 S3。

【讨论】:

  • 嘿 Ashish,说实话,我什至从不使用客户端。如果您检查我的代码,您会注意到我在 media_uri 中对文件进行了硬编码,但仍然无法运行.. 这有点令人沮丧
  • s3 = boto3.client('s3')我说的是这个客户。
  • 你也可以检查一下。 media_uri = "s3://aws-support-ml-demo-bucket/SampleInboundCall2.mp3" 以这种方式访问​​ Shell 脚本中的工作,Python 您应该获得完整的限定名称。
【解决方案3】:

Marcin 的回答实际上非常正确。如果您为作业选项指定 AllowDeferredExecution 参数(即使它设置为 false),您还需要指定 DataAccessRoleArn。

但是,使用与 lambda 相同的角色进行延迟执行将不起作用,因为该角色的信任策略可能在其 Principal.Service 字段中包含 lambda.amazonaws.com。就像 AWS 文档在 https://docs.aws.amazon.com/transcribe/latest/dg/job-queuing.html 中所说的那样,排队的作业需要包含允许 transcribe 担任该角色的信任策略。 IE。您需要有一个具有以下信任策略的角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "transcribe.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

因此,首先您需要创建一个新角色,该角色有权访问您用于作业的输入和输出文件的 S3 存储桶。然后,您需要为该角色添加正确的信任策略。在创建新角色时,您通常会将某些 AWS 服务作为基础服务并开始添加策略。 IAM 角色菜单中的初始服务选择设置为角色信任策略中的 Principal.Service。遗憾的是,在创建角色时没有 transcribe-service 可以开始,因此您需要从其他东西开始,例如 EC2,并在创建角色后编辑信任策略。您可以通过选择 IAM 中的角色并选择信任关系选项卡来做到这一点。

在我创建新角色并将上述信任策略和 S3 权限添加到该角色后,我可以将该角色用于延迟执行作业选项。

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 2021-01-03
    • 2022-08-18
    • 2021-08-27
    • 1970-01-01
    • 2016-07-04
    • 2022-06-10
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多