

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS SDK for PHP 버전 3을 사용한 Amazon S3 예제
<a name="s3-examples"></a>

Amazon Simple Storage Service (Amazon S3)는 안전하고 내구성과 확장성이 뛰어난 클라우드 스토리지를 제공합니다. Amazon S3는 웹 어디에서나 원하는 양의 데이터를 저장하고 검색할 수 있는 간단한 웹 서비스 인터페이스를 갖춘 사용하기 쉬운 객체 스토리지입니다.

에 대한 모든 예제 코드는 GitHub에서 확인할 AWS SDK for PHP 수 있습니다. [ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)

## 자격 증명
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에에 설명된 대로 AWS 자격 증명을 구성합니다[AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md). 그런 다음 AWS SDK for PHP에 설명된 대로를 가져옵니다[AWS SDK for PHP 버전 3 설치](getting-started_installation.md).

**Topics**
+ [자격 증명](#examplecredentials)
+ [Amazon S3 버킷 생성 및 사용](s3-examples-creating-buckets.md)
+ [Amazon S3 버킷 액세스 권한 관리](s3-examples-access-permissions.md)
+ [Amazon S3 버킷 구성](s3-examples-configuring-a-bucket.md)
+ [Amazon S3 멀티파트 업로드](s3-multipart-upload.md)
+ [Amazon S3에 미리 서명된 URL](s3-presigned-url.md)
+ [미리 서명된 S3 POST 생성](s3-presigned-post.md)
+ [Amazon S3 버킷을 정적 웹 호스트로 사용](s3-examples-static-web-host.md)
+ [Amazon S3 버킷 정책 작업](s3-examples-bucket-policies.md)
+ [S3 액세스 포인트 ARN 사용](s3-examples-access-point-arn.md)
+ [다중 리전 액세스 포인트 사용](s3-multi-region-access-points.md)

# AWS SDK for PHP 버전 3에서 Amazon S3 버킷 생성 및 사용
<a name="s3-examples-creating-buckets"></a>

다음 예제에서는 다음과 같은 작업을 하는 방법을 보여줍니다.
+ [ListBuckets](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#listbuckets)을 사용하여 요청의 인증된 발신자가 소유한 버킷 목록을 반환합니다.
+ [CreateBucket](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#createbucket)을 사용하여 새 버킷을 생성합니다.
+ [PutObject](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject)를 사용하여 버킷에 객체를 추가합니다.

AWS SDK for PHP에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에 [AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md)에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 [AWS SDK for PHP 버전 3 설치](getting-started_installation.md)에 설명된 AWS SDK for PHP를 가져옵니다.

 **가져옵니다**.

```
require 'vendor/autoload.php';

use Aws\S3\S3Client;
```

## 버킷 나열
<a name="list-buckets"></a>

다음 코드를 사용하여 PHP 파일을 생성합니다. 먼저 AWS 리전과 버전을 지정하는 AWS.S3 클라이언트 서비스를 생성합니다. 그런 다음 요청 발신자가 소유한 모든 Amazon S3 버킷을 버킷 구조 배열로 반환하는 `listBuckets` 메서드를 호출합니다.

 **샘플 코드** 

```
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

//Listing all S3 Bucket
$buckets = $s3Client->listBuckets();
foreach ($buckets['Buckets'] as $bucket) {
    echo $bucket['Name'] . "\n";
}
```

## 버킷 생성
<a name="create-a-bucket"></a>

다음 코드를 사용하여 PHP 파일을 생성합니다. 먼저 AWS 리전과 버전을 지정하는 AWS.S3 클라이언트 서비스를 생성합니다. 그런 다음 array를 파라미터로 사용하여 `createBucket` 메서드를 호출합니다. 유일하게 필요한 필드는 생성하려는 버킷 이름에 대한 문자열 값을 포함하는 'Bucket' 키입니다. 하지만 'CreateBucketConfiguration' 필드를 사용하여 AWS 리전을 지정할 수 있습니다. 성공할 경우 이 메서드는 버킷의 '위치'를 반환합니다.

 **샘플 코드** 

```
function createBucket($s3Client, $bucketName)
{
    try {
        $result = $s3Client->createBucket([
            'Bucket' => $bucketName,
        ]);
        return 'The bucket\'s location is: ' .
            $result['Location'] . '. ' .
            'The bucket\'s effective URI is: ' .
            $result['@metadata']['effectiveUri'];
    } catch (AwsException $e) {
        return 'Error: ' . $e->getAwsErrorMessage();
    }
}

function createTheBucket()
{
    $s3Client = new S3Client([
        'profile' => 'default',
        'region' => 'us-east-1',
        'version' => '2006-03-01'
    ]);

    echo createBucket($s3Client, 'amzn-s3-demo-bucket');
}

// Uncomment the following line to run this code in an AWS account.
// createTheBucket();
```

## 버킷에 객체 넣기
<a name="put-an-object-in-a-bucket"></a>

새 버킷에 파일을 추가하려면 다음 코드를 사용하여 PHP 파일을 생성합니다.

명령줄에서 이 파일을 실행하고 파일을 업로드할 버킷의 이름을 문자열로 전달하고 그 뒤에 업로드하려는 파일의 전체 파일 경로를 입력합니다.

 **샘플 코드** 

```
$USAGE = "\n" .
    "To run this example, supply the name of an S3 bucket and a file to\n" .
    "upload to it.\n" .
    "\n" .
    "Ex: php PutObject.php <bucketname> <filename>\n";

if (count($argv) <= 2) {
    echo $USAGE;
    exit();
}

$bucket = $argv[1];
$file_Path = $argv[2];
$key = basename($argv[2]);

try {
    //Create a S3Client
    $s3Client = new S3Client([
        'profile' => 'default',
        'region' => 'us-west-2',
        'version' => '2006-03-01'
    ]);
    $result = $s3Client->putObject([
        'Bucket' => $bucket,
        'Key' => $key,
        'SourceFile' => $file_Path,
    ]);
} catch (S3Exception $e) {
    echo $e->getMessage() . "\n";
}
```

# AWS SDK for PHP 버전 3을 사용한 Amazon S3 버킷 액세스 권한 관리
<a name="s3-examples-access-permissions"></a>

ACL(액세스 제어 목록)은 리소스 기반 액세스 정책 옵션 중 하나로, 해당 옵션을 사용해 버킷과 객체에 대한 액세스를 관리할 수 있습니다. ACL로 다른 AWS 계정에 기본적인 읽기/쓰기 권한을 부여할 수 있습니다. 자세한 내용은 [ACL을 사용한 액세스 관리](https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html)를 참조하세요.

다음 예에서는 작업 방법을 보여줍니다.
+ [GetBucketAcl](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#getbucketacl)을 사용하여 버킷에 대한 액세스 제어 정책을 가져옵니다.
+ [PutBucketAcl](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putbucketacl)을 사용하여 ACL로 버킷에 대한 권한을 설정합니다.

AWS SDK for PHP에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에 [AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md)에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 [AWS SDK for PHP 버전 3 설치](getting-started_installation.md)에 설명된 AWS SDK for PHP를 가져옵니다.

## 액세스 제어 목록 정책 가져오기 및 설정
<a name="get-and-set-an-access-control-list-policy"></a>

 **가져옵니다**.

```
require 'vendor/autoload.php';

use Aws\S3\S3Client;  
use Aws\Exception\AwsException;
```

 **샘플 코드** 

```
// Create a S3Client 
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

// Gets the access control policy for a bucket
$bucket = 'amzn-s3-demo-bucket';
try {
    $resp = $s3Client->getBucketAcl([
        'Bucket' => $bucket
    ]);
    echo "Succeed in retrieving bucket ACL as follows: \n";
    var_dump($resp);
} catch (AwsException $e) {
    // output error message if fails
    echo $e->getMessage();
    echo "\n";
}

// Sets the permissions on a bucket using access control lists (ACL).
$params = [
    'ACL' => 'public-read',
    'AccessControlPolicy' => [
        // Information can be retrieved from `getBucketAcl` response
        'Grants' => [
            [
                'Grantee' => [
                    'DisplayName' => '<string>',
                    'EmailAddress' => '<string>',
                    'ID' => '<string>',
                    'Type' => 'CanonicalUser',
                    'URI' => '<string>',
                ],
                'Permission' => 'FULL_CONTROL',
            ],
            // ...
        ],
        'Owner' => [
            'DisplayName' => '<string>',
            'ID' => '<string>',
        ],
    ],
    'Bucket' => $bucket,
];

try {
    $resp = $s3Client->putBucketAcl($params);
    echo "Succeed in setting bucket ACL.\n";
} catch (AwsException $e) {
    // Display error message
    echo $e->getMessage();
    echo "\n";
}
```

# AWS SDK for PHP 버전 3에서 Amazon S3 버킷 구성
<a name="s3-examples-configuring-a-bucket"></a>

교차 오리진 리소스 공유(CORS) 한 도메인에서 로드되어 다른 도메인에 있는 리소스와 상호 작용하는 클라이언트 웹 애플리케이션에 대한 방법을 정의합니다. Amazon S3에서 CORS 지원을 통해 Amazon S3으로 다양한 기능의 클라이언트 측 웹 애플리케이션을 구축하고, Amazon S3 리소스에 대한 Cross-Origin 액세스를 선택적으로 허용할 수 있습니다.

Amazon S3 버킷에서 CORS 구성을 사용하는 방법에 대한 자세한 내용은 [Cross-Origin Resource Sharing (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html)을 참조하세요.

다음 예제에서는 다음과 같은 작업을 하는 방법을 보여줍니다.
+ [GetBucketCors](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#getbucketcors)를 사용하여 버킷에 대한 CORS 구성을 가져옵니다.
+ [PutBucketCors](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putbucketcors)를 사용하여 버킷에 대한 CORS 구성을 설정합니다.

AWS SDK for PHP에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에 [AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md)에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 [AWS SDK for PHP 버전 3 설치](getting-started_installation.md)에 설명된 AWS SDK for PHP를 가져옵니다.

## CORS 구성 가져오기
<a name="get-the-cors-configuration"></a>

다음 코드를 사용하여 PHP 파일을 생성합니다. 먼저 AWS.S3 클라이언트 서비스를 생성한 다음 `getBucketCors` 메서드를 호출하고 CORS 구성을 원하는 버킷을 지정합니다.

필요한 유일한 파라미터는 선택된 버킷의 이름입니다. 버킷에 현재 CORS 구성이 있는 경우 Amazon S3에서 해당 구성을 [CORSRules 객체](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#shape-corsrule)로 반환합니다.

 **가져옵니다**.

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
$client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

try {
    $result = $client->getBucketCors([
        'Bucket' => $bucketName, // REQUIRED
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## CORS 구성 설정
<a name="set-the-cors-configuration"></a>

다음 코드를 사용하여 PHP 파일을 생성합니다. 먼저 AWS.S3 클라이언트 서비스를 생성합니다. 그런 다음 `putBucketCors` 메서드를 호출하고 CORS 구성을 설정할 버킷을 지정하고 CORSConfiguration을 [CORSRules JSON 객체](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#shape-corsrule)로 지정합니다.

 **가져옵니다**.

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
$client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

try {
    $result = $client->putBucketCors([
        'Bucket' => $bucketName, // REQUIRED
        'CORSConfiguration' => [ // REQUIRED
            'CORSRules' => [ // REQUIRED
                [
                    'AllowedHeaders' => ['Authorization'],
                    'AllowedMethods' => ['POST', 'GET', 'PUT'], // REQUIRED
                    'AllowedOrigins' => ['*'], // REQUIRED
                    'ExposeHeaders' => [],
                    'MaxAgeSeconds' => 3000
                ],
            ],
        ]
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

# AWS SDK for PHP 버전 3에서 Amazon S3 멀티파트 업로드 사용
<a name="s3-multipart-upload"></a>

단일 `PutObject` 작업으로 최대 5GB 크기의 객체를 업로드할 수 있습니다. 하지만 멀티파트 업로드 메서드(예: `CreateMultipartUpload`, `UploadPart`, `CompleteMultipartUpload`, `AbortMultipartUpload`)를 사용하면 5MB \$1 5TB 크기의 객체를 업로드할 수 있습니다.

다음 예에서는 작업 방법을 보여줍니다.
+ [ObjectUploader](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.ObjectUploader.html)를 사용하여 Amazon S3에 객체를 업로드합니다.
+ [MultipartUploader](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.MultipartUploader.html)를 사용하여 Amazon S3 객체에 대한 멀티파트 업로드를 생성합니다.
+ [ObjectCopier](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.ObjectCopier.html)를 사용하여 Amazon S3 위치 간 객체를 복사합니다.

에 대한 모든 예제 코드는 GitHub에서 확인할 AWS SDK for PHP 수 있습니다. [ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)

## 자격 증명
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에에 설명된 대로 AWS 자격 증명을 구성합니다[AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md). 그런 다음 AWS SDK for PHP에 설명된 대로를 가져옵니다[AWS SDK for PHP 버전 3 설치](getting-started_installation.md).

## 객체 업로더
<a name="object-uploader"></a>

작업에 `PutObject`와 `MultipartUploader` 중 어느 것이 더 적합한지 확실하지 않다면 `ObjectUploader`를 사용하세요. `ObjectUploader`는 페이로드 크기에 따라 `PutObject` 또는 `MultipartUploader` 중 하나를 사용하여 대용량 파일을 Amazon S3에 업로드합니다.

```
require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Aws\S3\ObjectUploader;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
// Create an S3Client.
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-2',
    'version' => '2006-03-01'
]);

$bucket = 'your-bucket';
$key = 'my-file.zip';

// Use a stream instead of a file path.
$source = fopen('/path/to/large/file.zip', 'rb');

$uploader = new ObjectUploader(
    $s3Client,
    $bucket,
    $key,
    $source
);

do {
    try {
        $result = $uploader->upload();
        if ($result["@metadata"]["statusCode"] == '200') {
            print('<p>File successfully uploaded to ' . $result["ObjectURL"] . '.</p>');
        }
        print($result);
        // If the SDK chooses a multipart upload, try again if there is an exception.
        // Unlike PutObject calls, multipart upload calls are not automatically retried.
    } catch (MultipartUploadException $e) {
        rewind($source);
        $uploader = new MultipartUploader($s3Client, $source, [
            'state' => $e->getState(),
        ]);
    }
} while (!isset($result));

fclose($source);
```

### 구성
<a name="object-uploader-configuration"></a>

`ObjectUploader` 객체 생성자는 다음 인수를 받습니다.

**`$client`**  
전송을 수행하는 데 사용할 `Aws\ClientInterface` 객체입니다. 이 객체는 `Aws\S3\S3Client`의 인스턴스여야 합니다.

**`$bucket`**  
(`string`, *필수*) 객체가 업로드되는 버킷의 이름입니다.

**`$key`**  
(`string`, *필수*) 업로드되는 객체에 사용할 키입니다.

**`$body`**  
(`mixed`, *필수*) 업로드할 객체 데이터. `StreamInterface`일 수 있습니다, PHP 스트림 리소스 또는 업로드할 데이터 문자열일 수 있습니다.

**`$acl`**  
(`string`) 업로드되는 객체에서 설정할 ACL(액세스 제어 목록)입니다. 객체는 기본적으로 프라이빗입니다.

**`$options`**  
멀티파트 업로드에 대한 구성 옵션의 결합형 배열입니다. 유효한 구성 옵션은 다음과 같습니다.    
**`add_content_md5`**  
(`bool`) true로 설정하면 업로드에 필요한 MD5 체크섬이 자동으로 계산됩니다.  
**`mup_threshold`**  
(`int`, *기본값*: `int(16777216)`) 파일 크기의 바이트 수입니다. 파일 크기가 이 제한을 초과하는 경우 멀티파트 업로드가 사용됩니다.  
**`before_complete`**  
(`callable`) `CompleteMultipartUpload` 작업 이전에 간접적으로 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다. `CommandInterface` 객체에 추가할 수 있는 파라미터는 [CompleteMultipartUpload API 참조](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#completemultipartupload)를 참조하세요.  
**`before_initiate`**  
(`callable`) `CreateMultipartUpload` 작업 이전에 간접적으로 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다. 파일 크기가 `mup_threshold` 값을 초과하면 이 콜백이 간접 호출됩니다. `CommandInterface` 객체에 추가할 수 있는 파라미터는 [CreateMultipartUpload API 참조](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#createmultipartupload)를 참조하세요.  
**`before_upload`**  
(`callable`) 모든 `PutObject` 또는 `UploadPart` 작업 이전에 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다. 파일 크기가 `mup_threshold` 값보다 작거나 같으면 이 콜백이 간접 호출됩니다. `PutObject` 요청에 적용할 수 있는 파라미터는 [PutObject API 참조](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject)를 참조하세요. `UploadPart` 요청에 적용되는 파라미터는 [UploadPart API 참조](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#uploadpart)를 참조하세요. SDK는 `CommandInterface` 객체로 표시되는 작업에 적용되지 않는 모든 파라미터를 무시합니다.  
**`concurrency`**  
(`int`, *기본값*: `int(3)`) 멀티파트 업로드 중에 허용되는 최대 동시 실행 `UploadPart` 작업 수입니다.  
**`part_size`**  
(`int`, *기본값*: `int(5242880)`) 멀티파트 업로드를 수행할 때 사용할 부분 크기(바이트)입니다. 값은 5MB에서 5GB 사이(포함)이어야 합니다.  
**`state`**  
(`Aws\Multipart\UploadState`) 멀티파트 업로드의 상태를 나타내며 이전 업로드를 다시 시작하는 데 사용되는 객체입니다. 이 옵션을 제공하면 `$bucket`, `$key` 인수 및 `part_size` 옵션이 무시됩니다.  
**`params`**  
각 하위 명령에 대한 구성 옵션을 제공하는 결합형 배열입니다. 예제:  

```
new ObjectUploader($bucket, $key, $body, $acl, ['params' => ['CacheControl' => <some_value>])
```

## MultipartUploader
<a name="multipartuploader"></a>

멀티파트 업로드는 대용량 객체의 업로드 경험을 개선하기 위해 디자인되었습니다. 이 메서드를 사용하면 객체를 독립적인 부분으로 어떤 순서로든 병렬로 업로드할 수 있습니다.

Amazon S3 고객은 100MB를 초과하는 객체에 멀티파트 업로드를 사용하는 것이 좋습니다.

## MultipartUploader 객체
<a name="multipartuploader-object"></a>

SDK에는 멀티파트 업로드 프로세스를 간소화하는 특수한 `MultipartUploader` 객체가 있습니다.

 **가져오기** 

```
require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

// Use multipart upload
$source = '/path/to/large/file.zip';
$uploader = new MultipartUploader($s3Client, $source, [
    'bucket' => 'your-bucket',
    'key' => 'my-file.zip',
]);

try {
    $result = $uploader->upload();
    echo "Upload complete: {$result['ObjectURL']}\n";
} catch (MultipartUploadException $e) {
    echo $e->getMessage() . "\n";
}
```

업로더는 제공된 소스와 구성을 기반으로 부분 데이터 생성기를 생성하고 모든 부분을 업로드하려고 시도합니다. 일부 부분 업로드가 실패하면 업로더는 전체 소스 데이터를 읽을 때까지 이후 부분을 계속해서 업로드합니다. 그런 다음 업로더가 실패한 부분을 다시 업로드하거나, 혹은 업로드에 실패한 부분에 대한 정보가 포함된 예외를 발생시킵니다.

## 멀티파트 업로드 사용자 지정
<a name="customizing-a-multipart-upload"></a>

생성기에 전달된 콜백을 통해 멀티파트 업로더에서 실행되는 `CreateMultipartUpload`, `UploadPart` 및 `CompleteMultipartUpload` 작업에 대해 사용자 지정 옵션을 설정할 수 있습니다.

 **가져오기** 

```
require 'vendor/autoload.php';

use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
// Create an S3Client
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

// Customizing a multipart upload
$source = '/path/to/large/file.zip';
$uploader = new MultipartUploader($s3Client, $source, [
    'bucket' => 'your-bucket',
    'key' => 'my-file.zip',
    'before_initiate' => function (Command $command) {
        // $command is a CreateMultipartUpload operation
        $command['CacheControl'] = 'max-age=3600';
    },
    'before_upload' => function (Command $command) {
        // $command is an UploadPart operation
        $command['RequestPayer'] = 'requester';
    },
    'before_complete' => function (Command $command) {
        // $command is a CompleteMultipartUpload operation
        $command['RequestPayer'] = 'requester';
    },
]);
```

### 부분 업로드 간 수동 가비지 수집
<a name="manual-garbage-collection-between-part-uploads"></a>

대용량 업로드로 인해 메모리 제한에 도달한 경우에는 메모리 제한에 도달했을 때 [PHP 가비지 수집기](https://www.php.net/manual/en/features.gc.php)에서 수집된 순환 참조가 아닌, SDK에서 생성된 순환 참조가 원인일 수 있습니다. 이때는 작업 사이에 수집 알고리즘을 직접 호출하면 제한에 도달하기 전에 순환 참조를 수집할 수 있습니다. 다음 예제는 각 부분 업로드 전에 콜백을 사용해 수집 알고리즘을 호출하는 것입니다. 단, 가비지 수집기를 호출할 경우 성능 비용이 발생하므로 사용 사례와 환경에 따라 사용하는 것이 좋습니다.

```
$uploader = new MultipartUploader($client, $source, [
   'bucket' => 'your-bucket',
   'key' => 'your-key',
   'before_upload' => function(\Aws\Command $command) {
      gc_collect_cycles();
   }
]);
```

## 오류 복구
<a name="recovering-from-errors"></a>

멀티파트 업로드 프로세스 중에 오류가 발생하면 `MultipartUploadException`이 발생합니다. 이 예외는 멀티파트 업로드의 진행률 정보가 포함된 `UploadState` 객체에 대한 액세스를 제공합니다. `UploadState`를 사용하여 완료하지 못한 업로드를 다시 시작할 수 있습니다.

 **가져오기** 

```
require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
// Create an S3Client
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

$source = '/path/to/large/file.zip';
$uploader = new MultipartUploader($s3Client, $source, [
    'bucket' => 'your-bucket',
    'key' => 'my-file.zip',
]);

//Recover from errors
do {
    try {
        $result = $uploader->upload();
    } catch (MultipartUploadException $e) {
        $uploader = new MultipartUploader($s3Client, $source, [
            'state' => $e->getState(),
        ]);
    }
} while (!isset($result));

//Abort a multipart upload if failed
try {
    $result = $uploader->upload();
} catch (MultipartUploadException $e) {
    // State contains the "Bucket", "Key", and "UploadId"
    $params = $e->getState()->getId();
    $result = $s3Client->abortMultipartUpload($params);
}
```

`UploadState`에서 업로드를 다시 시작하면 아직 업로드되지 않은 부분을 업로드하려고 시도합니다. 상태 객체는 업로드가 연속적이 아닌 경우 누락된 부분을 계속 추적합니다. 업로더는 제공된 소스 파일을 아직도 업로드해야 하는 부분에 속한 바이트 범위까지 세부적으로 읽거나 탐색합니다.

 `UploadState` 객체는 직렬화 가능하므로, 다른 프로세스에서 업로드를 다시 시작할 수도 있습니다. 또한 예외를 처리하지 않을 때에도 `$uploader->getState()`를 호출하여 `UploadState` 객체를 가져올 수 있습니다.

**중요**  
`MultipartUploader`에 소스로 전달된 스트림은 업로드 전에 자동으로 되감지 않습니다. 이전의 예제와 비슷한 루프에서 파일 경로 대신 스트림을 사용하는 경우 `catch` 블록 내부의 `$source` 변수를 재설정합니다.

 **가져오기** 

```
require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
// Create an S3Client
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

//Using stream instead of file path
$source = fopen('/path/to/large/file.zip', 'rb');
$uploader = new MultipartUploader($s3Client, $source, [
    'bucket' => 'your-bucket',
    'key' => 'my-file.zip',
]);

do {
    try {
        $result = $uploader->upload();
    } catch (MultipartUploadException $e) {
        rewind($source);
        $uploader = new MultipartUploader($s3Client, $source, [
            'state' => $e->getState(),
        ]);
    }
} while (!isset($result));
fclose($source);
```

### 멀티파트 업로드 중단
<a name="aborting-a-multipart-upload"></a>

멀티파트 업로드는 `UploadState` 객체에 포함된 `UploadId`을 불러와 `abortMultipartUpload`에 전달하여 중단할 수 있습니다.

```
try {
    $result = $uploader->upload();
} catch (MultipartUploadException $e) {
    // State contains the "Bucket", "Key", and "UploadId"
    $params = $e->getState()->getId();
    $result = $s3Client->abortMultipartUpload($params);
}
```

## 비동기 멀티파트 업로드
<a name="asynchronous-multipart-uploads"></a>

`upload()`에서 `MultipartUploader`를 호출하는 것은 차단 요청입니다. 비동기 콘텍스트에서 작업하는 경우 멀티파트 업로드에 대한 [promise](guide_promises.md)를 가져올 수 있습니다.

```
require 'vendor/autoload.php';

use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
// Create an S3Client
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

$source = '/path/to/large/file.zip';
$uploader = new MultipartUploader($s3Client, $source, [
    'bucket' => 'your-bucket',
    'key' => 'my-file.zip',
]);

$promise = $uploader->promise();
```

### 구성
<a name="asynchronous-multipart-uploads-configuration"></a>

`MultipartUploader` 객체 생성자는 다음 인수를 받습니다.

** `$client` **  
전송을 수행하는 데 사용할 `Aws\ClientInterface` 객체입니다. 이 객체는 `Aws\S3\S3Client`의 인스턴스여야 합니다.

** `$source` **  
업로드되는 소스 데이터입니다. 이 데이터는 경로 또는 URL(예: `/path/to/file.jpg`), 리소스 핸들(예: `fopen('/path/to/file.jpg', 'r)`) 또는 [PSR-7 스트림](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Psr.Http.Message.StreamInterface.html)의 인스턴스일 수 있습니다.

** `$config` **  
멀티파트 업로드에 대한 구성 옵션의 결합형 배열입니다.  
유효한 구성 옵션은 다음과 같습니다.    
** `acl` **  
(`string`) 업로드되는 객체에서 설정할 ACL(액세스 제어 목록)입니다. 객체는 기본적으로 프라이빗입니다.  
** `before_complete` **  
(`callable`) `CompleteMultipartUpload` 작업 이전에 간접적으로 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다.  
** `before_initiate` **  
(`callable`) `CreateMultipartUpload` 작업 이전에 간접적으로 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다.  
** `before_upload` **  
(`callable`) 모든 `UploadPart` 작업 이전에 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다.  
** `bucket` **  
(`string`, *필수*) 객체가 업로드되는 버킷의 이름입니다.  
** `concurrency` **  
(`int`, *기본값*: `int(5)`) 멀티파트 업로드 중에 허용되는 최대 동시 실행 `UploadPart` 작업 수입니다.  
** `key` **  
(`string`, *필수*) 업로드되는 객체에 사용할 키입니다.  
** `part_size` **  
(`int`, *기본값*: `int(5242880)`) 멀티파트 업로드를 수행할 때 사용할 부분 크기(바이트)입니다. 이 값은 5MB에서 5GB 사이(포함)이어야 합니다.  
** `state` **  
(`Aws\Multipart\UploadState`) 멀티파트 업로드의 상태를 나타내며 이전 업로드를 다시 시작하는 데 사용되는 객체입니다. 이 옵션을 제공하면 `bucket`, `key` 및 `part_size` 옵션이 무시됩니다.  
**`add_content_md5`**  
(`boolean`) true로 설정하면 업로드에 필요한 MD5 체크섬이 자동으로 계산됩니다.  
**`params`**  
각 하위 명령에 대한 구성 옵션을 제공하는 결합형 배열입니다. 예제:  

```
new MultipartUploader($client, $source, ['params' => ['CacheControl' => <some_value>]])
```

## 멀티파트 복사
<a name="multipart-copies"></a>

에는와 유사한 방식으로 `MultipartCopy` 사용`MultipartUploader`되지만 Amazon S3 내에서 크기가 5GB\$15TB인 객체를 복사하도록 설계된 객체 AWS SDK for PHP 도 포함되어 있습니다.

```
require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartCopy;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
// Create an S3Client
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

//Copy objects within S3
$copier = new MultipartCopy($s3Client, '/bucket/key?versionId=foo', [
    'bucket' => 'your-bucket',
    'key' => 'my-file.zip',
]);

try {
    $result = $copier->copy();
    echo "Copy complete: {$result['ObjectURL']}\n";
} catch (MultipartUploadException $e) {
    echo $e->getMessage() . "\n";
}
```

# AWS SDK for PHP 버전 3을 사용하는 Amazon S3 미리 서명된 URL
<a name="s3-presigned-url"></a>

HTTP 인증 헤더를 사용하는 대신 쿼리 문자열 파라미터로 필요한 정보를 전달하여 특정 유형의 요청을 인증할 수 있습니다. 이 방법은 요청을 프록시하지 않고 타사 브라우저에서 Amazon S3 비공개 데이터에 직접 액세스할 수 있도록 할 경우에 유용합니다. 핵심은 "미리 서명된" 요청을 구성하여 다른 사용자가 사용할 수 있는 URL로 인코딩하는 것입니다. 또한 만료 시간을 지정하여 미리 서명된 요청을 제한할 수 있습니다.

## HTTP GET 요청에 대해 미리 서명된 URL 생성
<a name="s3-presigned-url-get"></a>

다음 코드 예시는 SDK for PHP를 사용하여 HTTP GET 요청에 대해 미리 서명된 URL을 생성하는 방법을 보여줍니다.

```
<?php

require 'vendor/autoload.php';

use Aws\S3\S3Client;

$s3Client = new S3Client([
    'region' => 'us-west-2',
]);

// Supply a CommandInterface object and an expires parameter to the `createPresignedRequest` method.
$request = $s3Client->createPresignedRequest(
    $s3Client->getCommand('GetObject', [
        'Bucket' => 'amzn-s3-demo-bucket',
        'Key' => 'demo-key',
    ]),
    '+1 hour'
);

// From the resulting RequestInterface object, you can get the URL.
$presignedUrl = (string) $request->getUri();

echo $presignedUrl;
```

자세한 내용은 [`createPresignedRequest` 메서드에 대한 API 참조](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html#method_createPresignedRequest)에서 확인할 수 있습니다.

다른 사용자는 `$presignedUrl` 값을 사용하여 향후 1시간 이내에 해당 객체를 가져올 수 있습니다. 예를 들어 브라우저를 통해 HTTP GET 요청이 수행되면 S3 서비스에는 이 호출이 사전 서명된 URL을 생성한 사용자로부터 온 것으로 인식됩니다.

## HTTP PUT 요청에 대해 미리 서명된 URL 생성
<a name="s3-presigned-url-put"></a>

다음 코드 예시는 SDK for PHP를 사용하여 HTTP PUT 요청에 대해 미리 서명된 URL을 생성하는 방법을 보여줍니다.

```
<?php

require 'vendor/autoload.php';

use Aws\S3\S3Client;

$s3Client = new S3Client([
    'region' => 'us-west-2',
]);

$request = $s3Client->createPresignedRequest(
    $s3Client->getCommand('PutObject', [
        'Bucket' => 'amzn-s3-demo-bucket',
        'Key' => 'demo-key',
    ]),
    '+1 hour'
);

// From the resulting RequestInterface object, you can get the URL.
$presignedUrl = (string) $request->getUri();
```

이제 다른 사용자가 미리 서명된 URL을 HTTP PUT 요청에 사용하여 파일을 업로드할 수 있습니다.

```
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;

// ...

function uploadWithPresignedUrl($presignedUrl, $filePath, $s3Client): ?Response
{
    // Get the HTTP handler from the S3 client.
    $handler = $s3Client->getHandlerList()->resolve();
    
    // Create a stream from the file.
    $fileStream = new Stream(fopen($filePath, 'r'));
    
    // Create the request.
    $request = new Request(
        'PUT',
        $presignedUrl,
        [
            'Content-Type' => mime_content_type($filePath),
            'Content-Length' => filesize($filePath)
        ],
        $fileStream
    );
    
    // Send the request using the handler.
    try {
        $promise = $handler($request, []);
        $response = $promise->wait();
        return $response;
    } catch (Exception $e) {
        echo "Error uploading file: " . $e->getMessage() . "\n";
        return null;
    }
}
```

# AWS SDK for PHP 버전 3을 사용한 Amazon S3에서 사전 서명된 게시물
<a name="s3-presigned-post"></a>

미리 서명된 URL과 마찬가지로 미리 서명된 POST를 사용하여 AWS 보안 인증을 제공하지 않고 사용자에게 쓰기 권한을 부여할 수 있습니다. [AwsS3PostObjectV4](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.PostObjectV4.html)의 인스턴스를 활용하여 미리 서명된 POST 양식을 생성할 수 있습니다.

다음 예제에서는 다음과 같은 작업을 하는 방법을 보여줍니다.
+ [PostObjectV4](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.PostObjectV4.html)를 사용해 S3 Object POST 업로드 형식에 적합한 데이터를 가져옵니다.

AWS SDK for PHP에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="examplecredentials"></a>

**참고**  
`PostObjectV4`에서 AWS IAM Identity Center 가져온 보안 인증으로는 작동하지 않습니다.

예제 코드를 실행하기 전에 [AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md)에서 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 [AWS SDK for PHP 버전 3 설치](getting-started_installation.md)에 설명된 AWS SDK for PHP를 가져옵니다.

## PostObjectV4 생성
<a name="create-postobjectv4"></a>

`PostObjectV4` 인스턴스를 생성하려면 다음을 제공해야 합니다.
+ `Aws\S3\S3Client` 인스턴스 
+ 버킷
+ 양식 입력 필드의 결합형 배열
+ 정책 조건 배열 (Amazon Simple Storage Service 사용 설명서의 [정책 구성](https://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTForms.html) 참조)
+ 정책에 대한 만료 시간 문자열(선택 사항, 기본적으로 1시간)

 **가져옵니다**.

```
require '../vendor/autoload.php';

use Aws\S3\PostObjectV4;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
require '../vendor/autoload.php';

use Aws\S3\PostObjectV4;
use Aws\S3\S3Client;

$client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
]);
$bucket = 'amzn-s3-demo-bucket10';
$starts_with = 'user/eric/';
$client->listBuckets();

// Set defaults for form input fields.
$formInputs = ['acl' => 'public-read'];

// Construct an array of conditions for policy.
$options = [
    ['acl' => 'public-read'],
    ['bucket' => $bucket],
    ['starts-with', '$key', $starts_with],
];

// Set an expiration time (optional).
$expires = '+2 hours';

$postObject = new PostObjectV4(
    $client,
    $bucket,
    $formInputs,
    $options,
    $expires
);

// Get attributes for the HTML form, for example, action, method, enctype.
$formAttributes = $postObject->getFormAttributes();

// Get attributes for the HTML form values.
$formInputs = $postObject->getFormInputs();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>PHP</title>
</head>
<body>
<form action="<?php echo $formAttributes['action'] ?>" method="<?php echo $formAttributes['method'] ?>"
      enctype="<?php echo $formAttributes['enctype'] ?>">
    <label id="key">
        <input hidden type="text" name="key" value="<?php echo $starts_with ?><?php echo $formInputs['key'] ?>"/>
    </label>
    <h3>$formInputs:</h3>
    acl: <label id="acl">
        <input readonly type="text" name="acl" value="<?php echo $formInputs['acl'] ?>"/>
    </label><br/>
    X-Amz-Credential: <label id="credential">
        <input readonly type="text" name="X-Amz-Credential" value="<?php echo $formInputs['X-Amz-Credential'] ?>"/>
    </label><br/>
    X-Amz-Algorithm: <label id="algorithm">
        <input readonly type="text" name="X-Amz-Algorithm" value="<?php echo $formInputs['X-Amz-Algorithm'] ?>"/>
    </label><br/>
    X-Amz-Date: <label id="date">
        <input readonly type="text" name="X-Amz-Date" value="<?php echo $formInputs['X-Amz-Date'] ?>"/>
    </label><br/><br/><br/>
    Policy: <label id="policy">
        <input readonly type="text" name="Policy" value="<?php echo $formInputs['Policy'] ?>"/>
    </label><br/>
    X-Amz-Signature: <label id="signature">
        <input readonly type="text" name="X-Amz-Signature" value="<?php echo $formInputs['X-Amz-Signature'] ?>"/>
    </label><br/><br/>
    <h3>Choose file:</h3>
    <input type="file" name="file"/> <br/><br/>
    <h3>Upload file:</h3>
    <input type="submit" name="submit" value="Upload to Amazon S3"/>
</form>
</body>
</html>
```

# AWS SDK for PHP 버전 3을 사용한 Amazon S3 버킷을 정적 웹 호스트로 사용
<a name="s3-examples-static-web-host"></a>

Amazon S3에 정적 웹 사이트를 호스팅할 수 있습니다. 자세한 내용은 [Amazon S3 정적 웹 사이트 호스팅](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html)을 참조하세요.

다음 예에서는 작업 방법을 보여줍니다.
+ [GetBucketWebsite](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#getbucketwebsite)를 사용하여 버킷에 대한 웹 사이트 구성을 가져옵니다.
+ [PutBucketWebsite](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putbucketwebsite)를 사용하여 버킷에 대한 웹 사이트 구성을 설정합니다.
+ [DeleteBucketWebsite](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#deletebucketwebsite)를 사용하여 버킷에서 웹 사이트 구성을 제거합니다.

AWS SDK for PHP 버전 3에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="credentials-s3-examples-static-web-host"></a>

예제 코드를 실행하기 전에 AWS 보안 인증을 구성합니다. [AWS SDK for PHP 버전 3의 보안 인증](guide_credentials.md)을 참조하세요.

## 버킷에 대한 웹 사이트 구성 가져오기, 설정, 삭제
<a name="get-set-and-delete-the-website-configuration-for-a-bucket"></a>

 **가져옵니다**.

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

// Retrieving the Bucket Website Configuration
$bucket = 'amzn-s3-demo-bucket';
try {
    $resp = $s3Client->getBucketWebsite([
        'Bucket' => $bucket
    ]);
    echo "Succeed in retrieving website configuration for bucket: " . $bucket . "\n";
} catch (AwsException $e) {
    // output error message if fails
    echo $e->getMessage();
    echo "\n";
}

// Setting a Bucket Website Configuration
$params = [
    'Bucket' => $bucket,
    'WebsiteConfiguration' => [
        'ErrorDocument' => [
            'Key' => 'foo',
        ],
        'IndexDocument' => [
            'Suffix' => 'bar',
        ],
    ]
];

try {
    $resp = $s3Client->putBucketWebsite($params);
    echo "Succeed in setting bucket website configuration.\n";
} catch (AwsException $e) {
    // Display error message
    echo $e->getMessage();
    echo "\n";
}

// Deleting a Bucket Website Configuration
try {
    $resp = $s3Client->deleteBucketWebsite([
        'Bucket' => $bucket
    ]);
    echo "Succeed in deleting policy for bucket: " . $bucket . "\n";
} catch (AwsException $e) {
    // output error message if fails
    echo $e->getMessage();
    echo "\n";
}
```

# AWS SDK for PHP 버전 3을 사용한 Amazon S3 버킷 정책 작업
<a name="s3-examples-bucket-policies"></a>

버킷 정책을 사용하여 Amazon S3 리소스에 대한 권한을 부여할 수 있습니다. 자세한 내용은 [버킷 정책 및 사용자 정책 사용](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html)을 참조하세요.

다음 예에서는 작업 방법을 보여줍니다.
+ [GetBucketPolicy](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#getbucketpolicy)를 사용하여 지정된 버킷에 대한 정책을 반환합니다.
+ [PutBucketPolicy](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putbucketpolicy)를 사용하여 버킷에 대한 정책을 대체합니다.
+ [DeleteBucketPolicy](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#deletebucketpolicy)를 사용하여 버킷에서 정책을 삭제합니다.

AWS SDK for PHP에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에 [AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md)에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 [AWS SDK for PHP 버전 3 설치](getting-started_installation.md)에 설명된 AWS SDK for PHP를 가져옵니다.

## 버킷에 대한 정책 가져오기, 삭제, 바꾸기
<a name="get-delete-and-replace-a-policy-on-a-bucket"></a>

 **가져옵니다**.

```
require "vendor/autoload.php";

use Aws\Exception\AwsException;
use Aws\S3\S3Client;
```

 **샘플 코드** 

```
$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-west-2',
    'version' => '2006-03-01'
]);

$bucket = 'amzn-s3-demo-bucket';

// Get the policy of a specific bucket
try {
    $resp = $s3Client->getBucketPolicy([
        'Bucket' => $bucket
    ]);
    echo "Succeed in receiving bucket policy:\n";
    echo $resp->get('Policy');
    echo "\n";
} catch (AwsException $e) {
    // Display error message
    echo $e->getMessage();
    echo "\n";
}

// Deletes the policy from the bucket
try {
    $resp = $s3Client->deleteBucketPolicy([
        'Bucket' => $bucket
    ]);
    echo "Succeed in deleting policy of bucket: " . $bucket . "\n";
} catch (AwsException $e) {
    // Display error message
    echo $e->getMessage();
    echo "\n";
}

// Replaces a policy on the bucket
try {
    $resp = $s3Client->putBucketPolicy([
        'Bucket' => $bucket,
        'Policy' => 'foo policy',
    ]);
    echo "Succeed in put a policy on bucket: " . $bucket . "\n";
} catch (AwsException $e) {
    // Display error message
    echo $e->getMessage();
    echo "\n";
}
```

# S3 액세스 포인트 ARN AWS SDK for PHP 버전 3사용
<a name="s3-examples-access-point-arn"></a>

S3는 S3 버킷과 상호 작용하는 새로운 방법인 액세스 포인트를 도입했습니다. 액세스 포인트는 버킷에 직접 적용되는 대신 고유한 정책 및 구성을 적용할 수 있습니다. AWS SDK for PHP를 사용하면 버킷 이름을 명시적으로 지정하는 대신 API 작업에 버킷 필드에서 액세스 포인트 ARN을 사용할 수 있습니다. [여기](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-access-points.html)에서 S3 액세스 포인트 및 ARN의 작동 방식에 대한 자세한 내용을 확인할 수 있습니다. 다음 예제에서는 다음과 같은 작업을 하는 방법을 보여줍니다.
+ 액세스 포인트 ARN과 함께 [GetObject](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#getobject)를 사용하여 버킷에서 객체를 가져옵니다.
+ 액세스 포인트 ARN과 함께 [PutObject](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject)를 사용하여 버킷에 객체를 추가합니다.
+ 클라이언트 리전 대신 ARN 리전을 사용하도록 S3 클라이언트를 구성합니다.

AWS SDK for PHP에 대한 모든 예제 코드는 [GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)에서 사용할 수 있습니다.

## 보안 인증 정보
<a name="examplecredentials"></a>

예제 코드를 실행하기 전에 [AWS SDK for PHP 버전 3을 AWS 사용하여 로 인증](credentials.md)에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 [AWS SDK for PHP 버전 3 설치](getting-started_installation.md)에 설명된 AWS SDK for PHP를 가져옵니다.

 **가져옵니다**.

```
require 'vendor/autoload.php';

use Aws\S3\S3Client;
```

## 객체 가져오기
<a name="get-object"></a>

먼저 AWS 리전과 버전을 지정하는 AWS.S3 클라이언트 서비스를 생성합니다. 그런 다음 `getObject` 필드에서 키와 S3 액세스 포인트 ARN을 사용하여 `Bucket` 메서드를 호출하면 해당 액세스 포인트와 연결된 버킷에서 객체를 가져옵니다.

 **샘플 코드** 

```
$s3 = new S3Client([
    'version'     => 'latest',
    'region'      => 'us-west-2',
]);
$result = $s3->getObject([
    'Bucket' => 'arn:aws:s3:us-west-2:123456789012:accesspoint:endpoint-name',
    'Key' => 'MyKey'
]);
```

## 버킷에 객체 넣기
<a name="put-an-object-in-a-bucket"></a>

먼저 AWS 리전과 버전을 지정하는 AWS.S3 클라이언트 서비스를 생성합니다. 그런 다음 `putObject` 필드에서 원하는 키, 본문 또는 소스 파일과 S3 액세스 포인트 ARN을 사용하여 `Bucket` 메서드를 호출하면 해당 액세스 포인트와 연결된 버킷에 객체가 배치됩니다.

 **샘플 코드** 

```
$s3 = new S3Client([
    'version'     => 'latest',
    'region'      => 'us-west-2',
]);
$result = $s3->putObject([
    'Bucket' => 'arn:aws:s3:us-west-2:123456789012:accesspoint:endpoint-name',
    'Key' => 'MyKey',
    'Body' => 'MyBody'
]);
```

## 클라이언트 리전 대신 ARN 리전을 사용하도록 S3 클라이언트를 구성합니다.
<a name="configure-the-s3-client-to-use-the-arn-region-instead-of-the-client-region"></a>

S3 클라이언트 작업에서 S3 액세스 포인트 ARN을 사용하는 경우 기본적으로 클라이언트는 ARN 리전이 클라이언트 리전과 일치하는지 확인하고 그렇지 않은 경우 예외가 발생합니다. 이 동작은 `use_arn_region` 구성 옵션을 `true`로 설정하여 클라이언트 리전에서 ARN 리전을 수락하도록 변경할 수 있습니다. 기본적으로 이 옵션은 `false`로 설정되어 있습니다.

 **샘플 코드** 

```
$s3 = new S3Client([
    'version'        => 'latest',
    'region'         => 'us-west-2',
    'use_arn_region' => true
]);
```

클라이언트는 환경 변수와 구성 파일 옵션을 다음과 같은 우선 순위에 따라 확인합니다.

1. 위의 예제에서와 같은 클라이언트 옵션 `use_arn_region`.

1. 환경 변수 `AWS_S3_USE_ARN_REGION` 

```
export AWS_S3_USE_ARN_REGION=true
```

1. AWS 공유 구성 파일(기본적으로 `~/.aws/config`)의 구성 변수 `s3_use_arn_region`.

```
[default]
s3_use_arn_region = true
```

# AWS SDK for PHP 버전 3에서 Amazon S3 다중 리전 액세스 포인트 사용
<a name="s3-multi-region-access-points"></a>

[Amazon Simple Storage Service(S3) 다중 리전 액세스 포인트](https://docs.aws.amazon.com//AmazonS3/latest/userguide/MultiRegionAccessPoints.html)는 Amazon S3 요청 트래픽을 AWS 리전간에 라우팅하기 위한 글로벌 엔드포인트를 제공합니다.

SDK [for PHP, 다른 SDK, S3 콘솔 또는 CLI를 사용하여](https://docs.aws.amazon.com//aws-sdk-php/v3/api/api-s3control-2018-08-20.html#createmultiregionaccesspoint) 다중 리전 액세스 포인트를 생성할 수 있습니다. AWS [S3 AWS](https://docs.aws.amazon.com//AmazonS3/latest/userguide/multi-region-access-point-create-examples.html)

**중요**  
SDK for PHP에서 다중 리전 액세스 포인트를 사용하려면 PHP 환경에 [AWS 공통 런타임(AWS CRT) 확장](guide_crt.md)이 설치되어 있어야 합니다.

다중 리전 액세스 포인트를 생성하면 Amazon S3에서는 다음 형식의 Amazon 리소스 이름(ARN)을 생성합니다.

`arn:aws:s3::account-id:accesspoint/MultiRegionAccessPoint_alias`

생성된 ARN을 `[getObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#getobject)` 및 `[putObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject)` 메서드의 버킷 이름 대신 사용할 수 있습니다.

```
<?php
require './vendor/autoload.php';

use Aws\S3\S3Client;

// Assign the Multi-Region Access Point to a variable and use it place of a bucket name.
$mrap = 'arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap';
$key = 'my-key';

$s3Client = new S3Client([
    'region' => 'us-east-1'
]);

$s3Client->putObject([
    'Bucket' => $mrap,
    'Key' => $key,
    'Body' => 'Hello World!'
]);

$result = $s3Client->getObject([
    'Bucket' => $mrap,
    'Key' => $key
]);

echo $result['Body'] . "\n";

// Clean up.
$result = $s3Client->deleteObject([
    'Bucket' => $mrap,
    'Key' => $key
]);

$s3Client->waitUntil('ObjectNotExists', ['Bucket' => $mrap, 'Key' => $key]);

echo "Object deleted\n";
```