我現在正在嘗試使用 Lambda 函式從 S3 存盤桶中讀取 CSV 檔案(僅列名)。我在 Lambda 中創建了一個 S3 觸發器。這是示例代碼;
import json
import boto3
import csv
s3_client = boto3.client('s3')
def lambda_handler(event, context):
# TODO implement
bucket = event['Records'][0]['s3']['bucket']['name']
csv_file = event['Records'][0]['s3']['object']['key']
response = s3_client.get_object(Bucket=bucket, Key=csv_file)
lines = response['Body'].read().decode('utf-8').split()
results = []
for row in csv.DictReader(lines):
results.append(row.name())
print(results)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
每當我嘗試上傳新檔案時,都會出現此錯誤;
[ERROR] ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 10, in lambda_handler
response = s3_client.get_object(Bucket=bucket, Key=csv_file)
File "/var/runtime/botocore/client.py", line 386, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 705, in _make_api_call
raise error_class(parsed_response, operation_name
我添加了一個特定角色并為我的 S3 存盤桶提供了必要的權限。
我的 S3 存盤桶策略的片段:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*",
}
}
誰能告訴我為什么會出現這個錯誤?
uj5u.com熱心網友回復:
假設您的 S3 存盤桶負責呼叫 lambda 函式。這將需要兩方擁有權限。
1)。存盤桶需要有一個允許它觸發函式的策略。2)。將從存盤桶中提取 CSV 檔案的 lambda 也需要策略。為了實作第二部分,您可能需要考慮 SAM 模板中可用的預構建策略模板,這不僅會使您的策略定義更具可讀性,而且還會限制 lambda 可以在存盤桶上執行的操作。下面的第一個示例展示了如何授予 S3 CRUD 權限
S3CsvReactor:
Type: "AWS::Serverless::Function"
Name: "csv-process-function"
Properties:
CodeUri: csv-processor-function/
Handler: app.execute
Timeout: 30 # Seconds
Runtime: Python 3.8
MemorySize: 512
Policies:
- S3CrudPolicy:
BucketName: "s3-containing-your-csv"
下面的這個例子展示了只讀實作
S3CsvReactor:
Type: "AWS::Serverless::Function"
Name: "csv-process-function"
Properties:
CodeUri: csv-processor-function/
Handler: app.execute
Timeout: 30 # Seconds
Runtime: Python 3.8
MemorySize: 512
Policies:
- S3ReadPolicy:
BucketName: "s3-containing-your-csv"
下面的這個例子展示了只寫實作
S3CsvReactor:
Type: "AWS::Serverless::Function"
Name: "csv-process-function"
Properties:
CodeUri: csv-processor-function/
Handler: app.execute
Timeout: 30 # Seconds
Runtime: Python 3.8
MemorySize: 512
Policies:
- S3WritePolicy:
BucketName: "s3-containing-your-csv"
uj5u.com熱心網友回復:
確保角色可以對 IAM 策略中指定的 IAM 資源中的存盤桶執行 IAM 操作PutObject。GetObject將您的邏輯包裝在“try/except”塊中以及捕獲錯誤的良好做法,您可能會驚訝于 S3 傳播的錯誤的性質比預期的要早。此外,在 Lambda 控制臺中選擇此函式,然后單擊“監視器”選項卡以重定向到 CloudWatch Logs 控制臺,然后您可以閱讀有關錯誤的更多詳細資訊,尤其是在您提前回傳例外時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415548.html
標籤:
上一篇:是否可以讓IAM用戶在我的PC上運行沒有永久訪問密鑰的aws-cli?
下一篇:IaC下的資料庫供應實踐
