AWS CLI를 사용할 때는 Amazon S3에 액세스할 수 있지만, AWS SDK를 사용할 때는 액세스 거부 오류가 발생합니다. 이유가 무엇입니까?

최종 업데이트 날짜: 2021년 1월 27일

AWS CLI(AWS 명령줄 인터페이스)를 사용하는 경우 Amazon Simple Storage Service(Amazon S3) 리소스에 액세스할 수 있습니다. 하지만 AWS SDK를 사용할 때 액세스가 거부됩니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

AWS CLI를 사용하면 Amazon S3에 액세스할 수 있지만, AWS SDK를 사용할 때 액세스할 수 없는 경우 다음 문제 해결 단계를 수행합니다.

1.    사용하는 AWS CLI 및 AWS SDK가 동일한 자격 증명으로 구성되었는지 확인합니다.

2.    방화벽, HTTP 프록시 또는 Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트에서 Amazon S3에 대한 AWS SDK 요청을 허용하는지 확인합니다.

해결 방법

사용하는 AWS CLI 및 AWS SDK가 동일한 자격 증명으로 구성되었는지 확인합니다.

AWS CLI에 구성된 자격 증명을 가져오려면 다음 명령을 실행합니다.

aws iam list-access-keys

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

AWS CLI에 연결된 AWS Identity and Access Management(IAM) 역할을 사용하는 경우 다음 명령을 사용하여 역할을 가져옵니다.

aws sts get-caller-identity

사용하는 AWS SDK에 구성된 자격 증명을 가져오려면 AWS Security Token Service(AWS STS) 클라이언트를 사용하여 GetCallerIdentity 호출을 실행합니다. 예를 들어, Python용 AWS SDK(Boto3)를 사용하는 경우 get_caller_identity를 실행합니다.

AWS CLI 및 AWS SDK가 다른 자격 증명을 사용하는 경우 AWS CLI에 저장된 자격 증명으로 AWS SDK를 사용합니다.

방화벽, HTTP 프록시 또는 Amazon VPC 엔드포인트에서 Amazon S3에 대한 AWS CLI 또는 SDK 요청을 허용하는지 확인

구성된 자격 증명이 동일할 경우 S3에 대한 CLI 또는 SDK 요청도 동일한 소스에서 발생합니다. 예를 들어, 동일한 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 요청이 있는지 확인합니다.

요청이 동일한 자격 증명을 사용하는 동일한 소스에서 발생할 경우, SDK에서 원하는 자격 증명을 사용하고 있는지 확인하세요. 예를 들어 AWS SDK for Python(Boto3)을 사용할 경우 SDK에서는 자격 증명 구성 방법을 여러 가지 제공합니다. 그러므로 Boto3는 특정 순서에 따라 여러 위치에서 자격 증명을 찾습니다.

참고: Boto3는 특정 순서로 자격 증명을 검색하기 때문에 잘못된 자격 증명을 미리 지정하면 잘못된 자격 증명이 사용됩니다. 따라서 Boto3가 먼저 검사하는 위치에 올바른 자격 증명을 지정해야 합니다. Boto3가 자격 증명을 검색하는 순서에 대한 자세한 내용은 Boto3 SDK 웹사이트에서 자격 증명을 참조하세요.

올바른 자격 증명과 권한을 사용하는 것을 확인했는데도 액세스 거부 오류가 발생할 경우, 오류를 해결하세요. 오류의 다양한 근본 원인을 해결하는 방법에 대한 자세한 내용은 Amazon S3에서 403 액세스 거부 오류를 해결하려면 어떻게 해야 합니까?를 참조하세요.

요청이 여러 소스에서 전송된다면 SDK를 사용하는 소스가 방화벽, HTTP 프록시 또는 VPC 엔드포인트를 통해 요청을 보내고 있는지 확인합니다. 그런 다음, 방화벽, HTTP 프록시 또는 VPC 엔드포인트에서 Amazon S3로 전송하려는 요청을 허용하는지 확인합니다.

예를 들어, 다음 VPC 엔드포인트 정책은 DOC-EXAMPLE-BUCKET에 대한 다운로드 및 업로드 권한을 허용합니다. 이 VPC 엔드포인트를 사용하는 경우에는 다른 버킷에 대한 액세스가 거부됩니다.

{
    "Statement": [
        {
            "Sid": "Access-to-specific-bucket-only",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        }
    ]
  }

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?