簡體   English   中英

訪問被拒絕(服務:Amazon S3;狀態代碼:403;錯誤代碼:AccessDenied;請求 ID:xxxxxxxxxxxxx)

[英]Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxxxxxxxxx)

我正在嘗試使用部署在 ec2 上運行的 tomcat 上的應用程序訪問我的 s3 存儲桶。

我可以看到很多與此相關的帖子,但看起來他們中的大多數都抱怨沒有適當的訪問權限。 我可以正確訪問所有存儲桶,我可以使用不同的應用程序(如 jenkins s3 插件)從另一個應用程序上傳文件,沒有任何問題。 我不知道為什么這只會發生在部署在 tomcat 上的 java web 應用程序上。 我已經確認了以下事情。

  1. ec2 實例是使用 IAM 角色創建的。
  2. IAM 角色對存儲桶具有寫入權限。 傀儡腳本能夠寫入存儲桶。
  3. 嘗試與其他應用程序一起檢查 IAM 角色,它運行良好,沒有任何問題。

根據我的理解,如果我在創建 S3 存儲桶客戶端 (AmazonS3Client) 時不指定任何憑據,它將采用 IAM 角色身份驗證作為默認值。

這是我編寫的用於測試權限的示例函數。

public boolean checkWritePermission(String bucketName) {
    AmazonS3Client amazonS3Client=new AmazonS3Client();
    LOG.info("Checking bucket write permission.....");
    boolean hasWritePermissions = false;
    final ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(0);
    // Create empty content
    final InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
    // Create a PutObjectRequest with test object
    final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
            "TestDummy.txt", emptyContent, metadata);
    try {
        if (amazonS3Client.putObject(putObjectRequest) != null) {
            LOG.info("Permissions validated!");
            // User has write permissions, TestPassed.
            hasWritePermissions = true;

        }
    }
    catch (AmazonClientException s3Ex) {
        LOG.warn("Write permissions not available!", s3Ex.getMessage());
        LOG.error("Write permissions not available!", s3Ex);
    }
    return hasWritePermissions;
}

com.amazonaws.services.s3.model.AmazonS3Exception:訪問被拒絕(服務:Amazon S3;狀態代碼:403;錯誤代碼:AccessDenied;請求 ID:xxxxxxxxxxxxxx)。

不確定你是否已經解決了這個問題; 但是,如果您在存儲桶上使用自定義 KMS 密鑰,並且您嘗試訪問的文件已使用自定義密鑰加密,那么也會引發此錯誤。

由於您仍然可以列出 S3 存儲桶中的對象,因此有時會隱藏此問題。 確保您的 IAM 策略包含要解密的 kms 權限。

暫無
暫無

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

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