簡體   English   中英

嘗試從 AWS Lambda 訪問 S3 時訪問被拒絕

[英]Access Denied when trying to access S3 from AWS Lambda

我正在嘗試從 AWS lambda 訪問 S3,但訪問一直被拒絕。 lambda 代碼已部署,我在我的 PC 上運行一個應用程序調用 lambda。lambda 用於從 S3 讀取 1 個文件,修改它,並將其寫入 S3 中的不同位置。

我在沒有 lambda 的情況下運行了這段代碼,即進入 lambda 的邏輯可以駐留在我的 PC 上。 那行得通,即我在我的電腦上運行代碼。 該代碼成功地從 S3 獲取文件、修改它並保存它。 然而,當這個相同的邏輯被部署為 lambda 時,問題就出現了。因此我認為這是一些配置問題,但我不知道是什么。

這是我的 lambda 執行角色的內聯 s3 策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::MY_BUCKET/*"
        }
    ]
}

以下是 S3 存儲桶的策略配置:

{
    "Version": "2012-10-17",
    "Id": "PolicyNumber",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_ID:role/web_functions"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::MY_BUCKET/*"
        }
    ]
}

請注意,我現在使用的是“s3:*”。 我一直在嘗試各種組合,而 s3:* 僅在我可以正常工作之前使用。

另外(如果重要的話):

  • 運行時為 Go 1.x
  • 拱門:x86_64
  • 沒有配置 VPC
  • 對於 lambda 執行角色,還有 2 個其他策略。 1 是在 function 創建時間添加的用於日志記錄的默認策略。 另一個是在我啟用 X-Ray 監控時添加的。
  • 我的 S3 存儲桶不可公開訪問。
  • 我 PC 上的應用程序使用具有管理員權限的 IAM 角色運行。 這與 lambda 執行角色不同。

我看過其他回答這個問題的帖子,我想我已經涵蓋了所有內容,但仍然有問題。 如果您發現我遺漏的任何問題,請告訴我。

任何幫助將不勝感激

編輯:根據要求,我分享了部分代碼和錯誤消息:

func getS3Client(region string) *s3.Client {
    //region is a string (not aws.String()): "us-east-2"
    client := s3.New(s3.Options{
        Region: region,
    })
    return client
}

func getFile(bucket string, filename string) {
        client := getS3Client(region)
        object, err := client.GetObject(context.TODO(), &s3.GetObjectInput{
            Bucket: aws.String(bucket),
            Key:    aws.String(filename),
        })
        if err != nil {
            return nil, errors.New(fmt.Sprintf("Error reading s3 object: %v (bucket=%s, filename=%s)\n", err, bucket, filename))
    }   
}

這是 golang 報告的錯誤:

{"errorMessage":"Error reading s3 object: operation error S3: GetObject, https response error StatusCode: 403, RequestID: QEWV1F12YHCT862X, HostID: knxgns9O+oCTJ9G2p+hXNEyZJqjeTup/25Ab6Ih6jOrN/FAZvH7gjxKb0JEp3rGQMVyzqdgu30s=, api error AccessDenied: Access Denied (bucket=MY_BUCKET, filename=DCIM/061121/DSC01033.JPG)\n","errorType":"errorString"}

這是在 AWS 控制台中測試 lambda 的示例日志:

START RequestId: 33fe5480-bbfc-42e6-bce8-e5d3589d1187 Version: $LATEST
bucket: MY_BUCKET, filename: DCIM/061121/DSC01423.JPG, region: us-east-2
Error reading s3 object: operation error S3: GetObject, https response error StatusCode: 403, RequestID: KDCZ6XBVSNHX6HE1, HostID: FG1nTNI9MAwh2HhwBfRCE0Xj355RefzsSy1ludhM52rls6yzu+/ElgCeB27Q4i6enjPlX8HaGQ8=, api error AccessDenied: Access Denied (bucket=MY_BUCKET, filename=DCIM/061121/DSC01423.JPG)
: errorString
null
END RequestId: 33fe5480-bbfc-42e6-bce8-e5d3589d1187
REPORT RequestId: 33fe5480-bbfc-42e6-bce8-e5d3589d1187  Duration: 132.27 ms Billed Duration: 133 ms Memory Size: 512 MB Max Memory Used: 39 MB  Init Duration: 98.39 ms 

解決了

權限很好。 我什至不需要 S3 存儲桶的權限(它可以使用/不使用這些權限)。 錯誤與以下代碼行有關:

client := s3.New()

顯然,此調用不會繼承諸如服務角色值之類的內容。 但是,以下工作:

cfg, _ := config.LoadDefaultConfig(context.TODO())
client := s3.NewFromConfig(cfg)

由於我是從 lamba 而不是我的本地 PC 調用服務,所以我使用了 s3.New() 因為我沒有憑證文件,而且我沒有明確設置任何環境變量。 我錯誤地認為 s3.New() 將使用為 lambda 配置的角色。s3.NewFromConfig() 正確地做到了這一點。

希望這可以節省別人很多時間。

我假設附加到 lambda function 的角色是arn:aws:iam::ACCOUNT_ID:role/web_functions根據我的說法 Lambda function 缺少s3:ListBucket權限,這就是它顯示 403 錯誤的原因。 我建議嘗試以下政策。 它具有與s3:ListBucket權限相同的權限。

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::MY_BUCKET/*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "s3:ListBucket" "Resource": "*" } ] }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM