

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Migrasi ke v2 AWS SDK untuk Go
<a name="migrate-gosdk"></a>

## Versi Go Minimum
<a name="minimum-go-version"></a>

 Ini AWS SDK untuk Go membutuhkan versi minimum Go 1.23. Versi terbaru Go dapat diunduh di halaman [Unduhan](https://go.dev/dl/). Lihat [Riwayat Rilis](https://go.dev/doc/devel/release) untuk informasi selengkapnya tentang setiap rilis versi Go, dan informasi relevan yang diperlukan untuk meningkatkan. 

## Modularisasi
<a name="modularization"></a>

 AWS SDK untuk Go Telah diperbarui untuk memanfaatkan modul Go yang menjadi mode pengembangan default di Go 1.13. Sejumlah paket yang disediakan oleh SDK telah dimodulasi dan masing-masing diversi dan dirilis secara independen. Perubahan ini memungkinkan pemodelan ketergantungan aplikasi yang ditingkatkan, dan memungkinkan SDK menyediakan fitur dan fungsionalitas baru yang mengikuti strategi pembuatan versi modul Go. 

 Daftar berikut adalah beberapa modul Go yang disediakan oleh SDK: 


|  Modul  |  Deskripsi  | 
| --- | --- | 
|  github.com/aws/aws-sdk-go-v2  |  Inti SDK  | 
|  github.com/aws/aws-sdk-go-v2/config  |  Pemuatan Konfigurasi Bersama  | 
|  github.com/aws/aws-sdk-go-v2/credentials  |  AWS Penyedia Kredensi  | 
|  github.com/aws/aws-sdk-go-v2/feature/ec2/imds  |  Klien EC2 Layanan Metadata Instans Amazon  | 

 Klien layanan SDK dan modul utilitas tingkat yang lebih tinggi bersarang di bawah jalur impor berikut: 


|  Impor Root  |  Deskripsi  | 
| --- | --- | 
|  github.com/aws/aws-sdk-go-v2/service/  |  Modul Layanan Klien  | 
|  github.com/aws/aws-sdk-go-v2/feature/  |  Utilitas Tingkat Tinggi untuk layanan seperti Amazon S3 Transfer Manager  | 

## Pemuatan Konfigurasi
<a name="configuration-loading"></a>

 Paket [sesi](https://docs.aws.amazon.com/sdk-for-go/api/aws/session/) dan fungsionalitas terkait diganti dengan sistem konfigurasi yang disederhanakan yang disediakan oleh paket [konfigurasi](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config). `config`Paket ini adalah modul Go terpisah, dan dapat disertakan dalam dependensi aplikasi Anda dengan with. `go get` 

```
go get github.com/aws/aws-sdk-go-v2/config
```

 [Session.new](https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#New)[, sesi. ](https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#NewSession)NewSession[, [NewSessionWithOptions](https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#NewSessionWithOptions), dan [session.must harus](https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#Must) dimigrasikan ke config. LoadDefaultConfig](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#LoadDefaultConfig). 

 `config`Paket ini menyediakan beberapa fungsi pembantu yang membantu mengganti pemuatan konfigurasi bersama secara terprogram. Nama-nama fungsi ini diawali dengan `With` diikuti oleh opsi yang mereka timpa. Mari kita lihat beberapa contoh cara memigrasikan penggunaan `session` paket. 

 Untuk informasi selengkapnya tentang memuat konfigurasi bersama, lihat[Konfigurasikan SDK](configure-gosdk.md). 

### Contoh
<a name="examples"></a>

#### Migrasi dari ke NewSession LoadDefaultConfig
<a name="migrating-from-newsession-to-loaddefaultconfig"></a>

 Contoh berikut menunjukkan bagaimana penggunaan `session.NewSession` tanpa parameter argumen tambahan dimigrasikan ke`config.LoadDefaultConfig`. 

```
// V1 using NewSession

import "github.com/aws/aws-sdk-go/aws/session"

// ...

sess, err := session.NewSession()
if err != nil {
    // handle error
}
```

```
// V2 using LoadDefaultConfig

import "context"
import "github.com/aws/aws-sdk-go-v2/config"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
    // handle error
}
```

#### Bermigrasi dari NewSession dengan opsi AWS.config
<a name="migrating-from-newsession-with-awsconfig-options"></a>

 Contoh ini menunjukkan cara memigrasikan penggantian `aws.Config` nilai selama pemuatan konfigurasi. Satu atau lebih fungsi `config.With*` pembantu dapat disediakan `config.LoadDefaultConfig` untuk mengganti nilai konfigurasi yang dimuat. [Dalam contoh ini AWS Region diganti untuk `us-west-2` menggunakan konfigurasi. WithRegion](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#WithRegion)fungsi pembantu. 

```
// V1

import "github.com/aws/aws-sdk-go/aws"
import "github.com/aws/aws-sdk-go/aws/session"

// ...

sess, err := session.NewSession(aws.Config{
    Region: aws.String("us-west-2")
})
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/config"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO(),
    config.WithRegion("us-west-2"),
)
if err != nil {
    // handle error
}
```

#### Migrasi dari NewSessionWithOptions
<a name="migrating-from-newsessionwithoptions"></a>

 Contoh ini menunjukkan cara memigrasikan nilai utama selama pemuatan konfigurasi. Nol atau lebih fungsi `config.With*` pembantu dapat disediakan `config.LoadDefaultConfig` untuk mengganti nilai konfigurasi yang dimuat. Dalam contoh ini kami menunjukkan cara mengganti profil target yang digunakan saat memuat konfigurasi bersama AWS SDK. 

```
// V1

import "github.com/aws/aws-sdk-go/aws"
import "github.com/aws/aws-sdk-go/aws/session"

// ...

sess, err := session.NewSessionWithOptions(aws.Config{
    Profile: "my-application-profile"
})
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/config"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO(),
    config.WithSharedConfigProfile("my-application-profile"),
)
if err != nil {
    // handle error
}
```

## Mengejek dan `*iface`
<a name="mocking-and-iface"></a>

 `*iface`Paket dan antarmuka di dalamnya (misalnya [S3iface.s3API](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3iface/#S3API)) telah dihapus. Definisi antarmuka ini tidak stabil karena rusak setiap kali layanan menambahkan operasi baru. 

 Penggunaan `*iface` harus diganti dengan antarmuka yang ditentukan pemanggil cakupan untuk operasi layanan yang digunakan: 

```
// V1

import "io"

import "github.com/aws/aws-sdk-go/service/s3"
import "github.com/aws/aws-sdk-go/service/s3/s3iface"

func GetObjectBytes(client s3iface.S3API, bucket, key string) ([]byte, error) {
    object, err := client.GetObject(&s3.GetObjectInput{
        Bucket: &bucket,
        Key:    &key,
    })
    if err != nil {
        return nil, err
    }
    defer object.Body.Close()

    return io.ReadAll(object.Body)
}
```

```
// V2

import "context"
import "io"

import "github.com/aws/aws-sdk-go-v2/service/s3"

type GetObjectAPIClient interface {
    GetObject(context.Context, *s3.GetObjectInput, ...func(*s3.Options)) (*s3.GetObjectOutput, error)
}

func GetObjectBytes(ctx context.Context, client GetObjectAPIClient, bucket, key string) ([]byte, error) {
    object, err := client.GetObject(ctx, &s3.GetObjectInput{
        Bucket: &bucket,
        Key:    &key,
    })
    if err != nil {
        return nil, err
    }
    defer object.Body.Close()

    return io.ReadAll(object.Body)
}
```

 Untuk informasi lebih lanjut, lihat [Unit Testing dengan AWS SDK untuk Go v2](unit-testing.md). 

## Penyedia Kredensyal dan Kredensyal
<a name="credentials--credential-providers"></a>

 [Paket [aws/credentials](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/) dan penyedia kredensi terkait telah dipindahkan ke lokasi paket kredensyal.](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials) `credentials`Paket ini adalah modul Go yang Anda ambil dengan menggunakan`go get`. 

```
go get github.com/aws/aws-sdk-go-v2/credentials
```

 Rilis AWS SDK untuk Go v2 memperbarui Penyedia AWS Kredensyal untuk menyediakan antarmuka yang konsisten untuk mengambil AWS Kredensyal. Setiap penyedia mengimplementasikan [aws. CredentialsProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#CredentialsProvider)antarmuka, yang mendefinisikan `Retrieve` metode yang mengembalikan a`(aws.Credentials, error)`. [AWS.credentials](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#Credentials) [yang analog dengan tipe v1 credentials.Value. AWS SDK untuk Go](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/#Value) 

 Anda harus membungkus `aws.CredentialsProvider` objek dengan [aws. CredentialsCache](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#CredentialsCache)untuk memungkinkan caching kredenal terjadi. Anda gunakan [NewCredentialsCache](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#NewCredentialsCache)untuk membangun `aws.CredentialsCache` objek. Secara default, kredensyal yang dikonfigurasi oleh `config.LoadDefaultConfig` dibungkus dengan. `aws.CredentialsCache` 

 Tabel berikut mencantumkan perubahan lokasi penyedia AWS kredensyal dari AWS SDK untuk Go v1 ke v2. 


|  Nama  |  V1 Impor  |  V2 Impor  | 
| --- | --- | --- | 
|  Kredensyal Peran Amazon EC2 IAM  |  github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds  |  github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds  | 
|  Kredensyal Endpoint  |  github.com/aws/aws-sdk-go/aws/credentials/endpointcreds  |  github.com/aws/aws-sdk-go-v2/credentials/endpointcreds  | 
|  Kredensyal Proses  |  github.com/aws/aws-sdk-go/aws/credentials/processcreds  |  github.com/aws/aws-sdk-go-v2/credentials/processcreds  | 
|  AWS Security Token Service  |  github.com/aws/aws-sdk-go/aws/credentials/stscreds  |  github.com/aws/aws-sdk-go-v2/credentials/stscreds  | 

### Kredensyal Statis
<a name="static-credentials"></a>

 Aplikasi yang menggunakan [kredensyal. ](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials//#NewStaticCredentials)NewStaticCredentials[untuk membangun kredensyal statis secara terprogram harus menggunakan kredensyal. NewStaticCredentialsProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials#NewStaticCredentialsProvider). 

#### Contoh
<a name="example"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/credentials"

// ...

appCreds := credentials.NewStaticCredentials(accessKey, secretKey, sessionToken)
value, err := appCreds.Get()
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/aws"
import "github.com/aws/aws-sdk-go-v2/credentials"

// ...

appCreds := aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(accessKey, secretKey, sessionToken))
value, err := appCreds.Retrieve(context.TODO())
if err != nil {
    // handle error
}
```

### Kredensyal Peran Amazon EC2 IAM
<a name="ec2-iam-role-credentials"></a>

 Anda harus memigrasikan penggunaan [NewCredentials](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/ec2rolecreds/#NewCredentials)dan [NewCredentialsWithClient](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/ec2rolecreds/#NewCredentialsWithClient)untuk menggunakan [New](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds#New). 

 `ec2rolecreds`Paket menggunakan opsi fungsional `ec2rolecreds.New` [EC2RoleCreds.Options](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds#Options) sebagai input, memungkinkan Anda mengganti klien Layanan Metadata EC2 Instans Amazon tertentu untuk digunakan, atau untuk mengganti jendela kedaluwarsa kredensyal. 

#### Contoh
<a name="w2aac43c11c17b7"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"

// ...

appCreds := ec2rolecreds.NewCredentials(sess)
value, err := appCreds.Get()
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/aws"
import "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds"

// ...

// New returns an object of a type that satisfies the aws.CredentialProvider interface
appCreds := aws.NewCredentialsCache(ec2rolecreds.New())
value, err := appCreds.Retrieve(context.TODO())
if err != nil {
    // handle error
}
```

### Kredensyal Endpoint
<a name="endpoint-credentials"></a>

 Anda harus memigrasikan penggunaan [NewCredentialsClient](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/endpointcreds/#NewCredentialsClient)dan [NewProviderClient](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/endpointcreds/#NewProviderClient)untuk menggunakan [New](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds#New). 

 `New`Fungsi `endpointcreds` paket mengambil argumen string yang berisi URL titik akhir HTTP atau HTTPS untuk mengambil kredensyal dari, dan opsi fungsional [EndpointCreds.Options untuk mengubah penyedia kredensyal dan mengganti](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds#Options) pengaturan konfigurasi tertentu. 

### Kredensyal Proses
<a name="process-credentials"></a>

 Anda harus memigrasikan penggunaan [NewCredentials](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/processcreds/#NewCredentials), [NewCredentialsCommand](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/processcreds/#NewCredentialsCommand), dan [NewCredentialsTimeout](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/processcreds/#NewCredentialsTimeout)untuk menggunakan [NewProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/processcreds#New)atau [NewProviderCommand](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/processcreds#NewProviderCommand). 

 `NewProvider`[Fungsi `processcreds` paket mengambil argumen string yang merupakan perintah yang akan dieksekusi di shell lingkungan host, dan opsi fungsional Options untuk mengubah penyedia kredensyal dan mengganti pengaturan konfigurasi tertentu.](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/processcreds#Options) 

 `NewProviderCommand`mengambil implementasi [NewCommandBuilder](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/processcreds#NewCommandBuilder)antarmuka yang mendefinisikan perintah proses yang lebih kompleks yang mungkin mengambil satu atau lebih argumen baris perintah, atau memiliki persyaratan lingkungan eksekusi tertentu. [DefaultNewCommandBuilder](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/processcreds#DefaultNewCommandBuilder)mengimplementasikan antarmuka ini, dan mendefinisikan pembuat perintah untuk proses yang memerlukan beberapa argumen baris perintah. 

#### Contoh
<a name="example-2"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/credentials/processcreds"

// ...

appCreds := processcreds.NewCredentials("/path/to/command")
value, err := appCreds.Get()
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/aws"
import "github.com/aws/aws-sdk-go-v2/credentials/processcreds"

// ...

appCreds := aws.NewCredentialsCache(processcreds.NewProvider("/path/to/command"))
value, err := appCreds.Retrieve(context.TODO())
if err != nil {
    // handle error
}
```

### AWS Security Token Service Kredensyal
<a name="stslong-credentials"></a>

#### AssumeRole
<a name="assumerole"></a>

 Anda harus memigrasikan penggunaan [NewCredentials](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/stscreds/#NewCredentials), dan [NewCredentialsWithClient](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/stscreds/#NewCredentialsWithClient)untuk menggunakan [NewAssumeRoleProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/stscreds#NewAssumeRoleProvider). 

 `NewAssumeRoleProvider`Fungsi `stscreds` paket harus dipanggil dengan [STS.Client](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/sts#Client), dan AWS Identity and Access Management ARN Peran diasumsikan dari kredenal yang dikonfigurasi yang disediakan`sts.Client`. Anda juga dapat menyediakan serangkaian opsi fungsional [AssumeRoleOptions](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/stscreds#AssumeRoleOptions)untuk memodifikasi pengaturan opsional lain dari penyedia. 

##### Contoh
<a name="example-3"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/credentials/stscreds"

// ...

appCreds := stscreds.NewCredentials(sess, "arn:aws:iam::123456789012:role/demo")
value, err := appCreds.Get()
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/credentials/stscreds"
import "github.com/aws/aws-sdk-go-v2/service/sts"

// ...

client := sts.NewFromConfig(cfg)

appCreds := stscreds.NewAssumeRoleProvider(client, "arn:aws:iam::123456789012:role/demo")
value, err := appCreds.Retrieve(context.TODO())
if err != nil {
    // handle error
}
```

#### AssumeRoleWithWebIdentity
<a name="assumerolewithwebidentity"></a>

 Anda harus memigrasikan penggunaan [NewWebIdentityCredentials](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/stscreds/#NewWebIdentityCredentials), [NewWebIdentityRoleProvider](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/stscreds/#NewWebIdentityRoleProvider), dan [NewWebIdentityRoleProviderWithToken](https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/stscreds/#NewWebIdentityRoleProviderWithToken)untuk digunakan [NewWebIdentityRoleProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/stscreds#NewWebIdentityRoleProvider). 

 `NewWebIdentityRoleProvider`Fungsi `stscreds` paket harus dipanggil dengan [STS.Client](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/sts#Client), dan AWS Identity and Access Management ARN Peran diasumsikan menggunakan kredensyal yang dikonfigurasi yang disediakan`sts.Client`, dan implementasi untuk [IdentityTokenRetriever](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/stscreds#IdentityTokenRetriever)menyediakan token ID 2.0 atau OAuth OpenID Connect. [IdentityTokenFile](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/stscreds#IdentityTokenFile)adalah `IdentityTokenRetriever` yang dapat digunakan untuk memberikan token identitas web dari file yang terletak di sistem file host aplikasi. Anda juga dapat menyediakan serangkaian opsi fungsional [WebIdentityRoleOptions](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/stscreds#WebIdentityRoleOptions)untuk memodifikasi pengaturan opsional lainnya untuk penyedia. 

##### Contoh
<a name="example-4"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/credentials/stscreds"

// ...

appCreds := stscreds.NewWebIdentityRoleProvider(sess, "arn:aws:iam::123456789012:role/demo", "sessionName", "/path/to/token")
value, err := appCreds.Get()
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/aws"
import "github.com/aws/aws-sdk-go-v2/credentials/stscreds"
import "github.com/aws/aws-sdk-go-v2/service/sts"

// ...

client := sts.NewFromConfig(cfg)

appCreds := aws.NewCredentialsCache(stscreds.NewWebIdentityRoleProvider(
        client,
        "arn:aws:iam::123456789012:role/demo",
        stscreds.IdentityTokenFile("/path/to/file"),
        func(o *stscreds.WebIdentityRoleOptions) {
            o.RoleSessionName = "sessionName"
        }))
value, err := appCreds.Retrieve(context.TODO())
if err != nil {
    // handle error
}
```

## Layanan Klien
<a name="service-clients"></a>

 AWS SDK untuk Go menyediakan modul klien layanan yang bersarang di bawah jalur `github.com/aws/aws-sdk-go-v2/service` impor. Setiap klien layanan terkandung dalam paket Go menggunakan pengenal unik setiap layanan. Tabel berikut memberikan beberapa contoh jalur impor layanan di AWS SDK untuk Go. 


|  Nama Layanan  |  Jalur Impor V1  |  Jalur Impor V2  | 
| --- | --- | --- | 
|  Amazon S3  |  github.com/aws/aws-sdk-go/service/s3  |  github.com/aws/aws-sdk-go-v2/service/s3  | 
|  Amazon DynamoDB  |  github.com/aws/aws-sdk-go/service/dynamodb  |  github.com/aws/aws-sdk-go-v2/service/dynamodb  | 
|  CloudWatch Log Amazon  |  github.com/aws/aws-sdk-go/service/cloudwatchlogs  |  github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs  | 

 Setiap paket klien layanan adalah modul Go berversi independen. Untuk menambahkan klien layanan sebagai dependensi aplikasi Anda, gunakan `go get` perintah dengan jalur impor layanan. Misalnya, untuk menambahkan klien Amazon S3 ke dependensi Anda gunakan 

```
go get github.com/aws/aws-sdk-go-v2/service/s3
```

### Konstruksi Klien
<a name="client-construction"></a>

 Anda dapat membangun klien dalam AWS SDK untuk Go menggunakan fungsi `New` atau `NewFromConfig` konstruktor dalam paket klien. Saat bermigrasi dari AWS SDK untuk Go v1, kami sarankan Anda menggunakan `NewFromConfig` varian, yang akan mengembalikan klien layanan baru menggunakan nilai dari file. `aws.Config` `aws.Config`Nilai akan dibuat saat memuat konfigurasi bersama SDK menggunakan`config.LoadDefaultConfig`. Untuk detail tentang membuat klien layanan, lihat[Gunakan AWS SDK untuk Go v2 dengan AWS layanan](use-services.md). 

#### Contoh 1
<a name="w2aac43c13c11b5"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/session"
import "github.com/aws/aws-sdk-go/service/s3"

// ...

sess, err := session.NewSession()
if err != nil {
    // handle error
}

client := s3.New(sess)
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/config"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
    // handle error
}

client := s3.NewFromConfig(cfg)
```

#### Contoh 2: Mengganti Pengaturan Klien
<a name="example-2-overriding-client-settings"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws"
import "github.com/aws/aws-sdk-go/aws/session"
import "github.com/aws/aws-sdk-go/service/s3"

// ...

sess, err := session.NewSession()
if err != nil {
    // handle error
}

client := s3.New(sess, &aws.Config{
    Region: aws.String("us-west-2"),
})
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/config"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
    // handle error
}

client := s3.NewFromConfig(cfg, func(o *s3.Options) {
    o.Region = "us-west-2"
})
```

### Titik akhir
<a name="endpoints"></a>

 Paket [titik akhir](https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/) tidak ada lagi di. AWS SDK untuk Go Setiap klien layanan sekarang menyematkan metadata AWS titik akhir yang diperlukan dalam paket klien. Ini mengurangi ukuran biner keseluruhan aplikasi yang dikompilasi dengan tidak lagi menyertakan metadata titik akhir untuk layanan yang tidak digunakan oleh aplikasi Anda. 

 Selain itu, setiap layanan sekarang memperlihatkan antarmuka sendiri untuk resolusi titik akhir di. `EndpointResolverV2` Setiap API mengambil satu set parameter unik untuk layanan`EndpointParameters`, yang nilainya bersumber dari SDK dari berbagai lokasi saat operasi dipanggil. 

 Secara default, klien layanan menggunakan AWS Wilayah yang dikonfigurasi untuk menyelesaikan titik akhir layanan untuk Wilayah target. Jika aplikasi Anda memerlukan titik akhir kustom, Anda dapat menentukan perilaku kustom pada `EndpointResolverV2` bidang pada `aws.Config` struktur. Jika aplikasi Anda mengimplementasikan [Endpoints.Resolver](https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/#Resolver) kustom, Anda harus memigrasikannya agar sesuai dengan antarmuka per-layanan baru ini. 

 Untuk informasi selengkapnya tentang titik akhir dan menerapkan resolver kustom, lihat. [Konfigurasikan Titik Akhir Klien](configure-endpoints.md) 

### Autentikasi
<a name="authentication"></a>

 AWS SDK untuk Go Mendukung perilaku otentikasi yang lebih canggih, yang memungkinkan penggunaan fitur AWS layanan yang lebih baru seperti codecatalyst dan S3 Express One Zone. Selain itu, perilaku ini dapat disesuaikan berdasarkan per klien. 

### Memanggil Operasi API
<a name="invoking-api-operations"></a>

 Jumlah metode operasi klien layanan telah berkurang secara signifikan. `<OperationName>`Metode`<OperationName>Request`,`<OperationName>WithContext`, dan semuanya telah dikonsolidasikan ke dalam metode operasi tunggal,`<OperationName>`. 

#### Contoh
<a name="example-5"></a>

 Contoh berikut menunjukkan bagaimana panggilan ke PutObject operasi Amazon S3 akan dimigrasikan dari AWS SDK untuk Go v1 ke v2. 

```
// V1

import "context"
import "github.com/aws/aws-sdk-go/service/s3"

// ...

client := s3.New(sess)

// Pattern 1
output, err := client.PutObject(&s3.PutObjectInput{
    // input parameters
})

// Pattern 2
output, err := client.PutObjectWithContext(context.TODO(), &s3.PutObjectInput{
    // input parameters
})

// Pattern 3
req, output := client.PutObjectRequest(context.TODO(), &s3.PutObjectInput{
    // input parameters
})
err := req.Send()
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

client := s3.NewFromConfig(cfg)

output, err := client.PutObject(context.TODO(), &s3.PutObjectInput{
    // input parameters
})
```

### Jenis Data Layanan
<a name="service-data-types"></a>

 Jenis input dan output tingkat atas dari suatu operasi ditemukan dalam paket klien layanan. Jenis input dan output untuk operasi tertentu mengikuti pola `<OperationName>Input` dan`<OperationName>Output`, di `OperationName` mana nama operasi yang Anda panggil. Misalnya, bentuk input dan output untuk PutObject operasi Amazon S3 adalah [PutObjectInput](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#PutObjectInput)dan [PutObjectOutput](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#PutObjectOutput)masing-masing. 

 Semua tipe data layanan lainnya, selain jenis input dan output, telah dimigrasikan ke `types` paket yang terletak di bawah hirarki jalur impor paket klien layanan. Misalnya, [s3. AccessControlPolicy](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#AccessControlPolicy)tipe sekarang terletak di [tipe. AccessControlPolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3/types#AccessControlPolicy). 

#### Nilai Pencacahan
<a name="enumeration-values"></a>

 SDK sekarang menyediakan pengalaman yang diketik untuk semua bidang enumerasi API. Daripada menggunakan nilai literal string yang disalin dari dokumentasi referensi API layanan, Anda sekarang dapat menggunakan salah satu tipe konkret yang ditemukan dalam `types` paket klien layanan. Misalnya, Anda dapat memberikan PutObjectInput operasi Amazon S3 dengan ACL untuk diterapkan pada objek. Di AWS SDK untuk Go v1, parameter ini adalah `*string` tipe. Dalam AWS SDK untuk Go, parameter ini sekarang menjadi [tipe. ObjectCannedACL](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3/types#ObjectCannedACL). `types`Paket ini menyediakan konstanta yang dihasilkan untuk nilai enumerasi valid yang dapat ditetapkan ke bidang ini. Misalnya [jenis. ObjectCannedACLPrivate](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3/types#ObjectCannedACLPrivate)adalah konstanta untuk nilai ACL kalengan “pribadi”. Nilai ini dapat digunakan sebagai pengganti mengelola konstanta string dalam aplikasi Anda. 

### Parameter Pointer
<a name="pointer-parameters"></a>

 Referensi pointer AWS SDK untuk Go v1 diperlukan untuk diteruskan untuk semua parameter input ke operasi layanan. AWS SDK untuk Go V2 telah menyederhanakan pengalaman dengan sebagian besar layanan dengan menghilangkan kebutuhan untuk meneruskan nilai input sebagai pointer jika memungkinkan. Perubahan ini berarti bahwa banyak operasi klien layanan tidak lagi memerlukan aplikasi Anda untuk meneruskan referensi pointer untuk jenis berikut:`uint8`,,`uint16`,`uint32`,`int8`,`int16`,`int32`, `float32``float64`,`bool`. Demikian pula, tipe elemen slice dan map telah diperbarui sesuai untuk mencerminkan apakah elemen mereka harus diteruskan sebagai referensi pointer. 

 Paket [aws](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws) berisi fungsi pembantu untuk membuat pointer untuk tipe bawaan Go, pembantu ini harus digunakan untuk lebih mudah menangani pembuatan tipe penunjuk untuk tipe Go ini. Demikian pula, metode pembantu disediakan untuk menghilangkan referensi nilai pointer dengan aman untuk jenis ini. Misalnya, fungsi [AWS.String](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#String) mengkonversi dari ⇒. `string` `*string` Sebaliknya, [aws. ToString](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#ToString)mengkonversi dari `*string` ⇒`string`. Saat memutakhirkan aplikasi dari AWS SDK untuk Go v1 ke v2, Anda harus memigrasikan penggunaan helper untuk mengonversi dari tipe pointer ke varian non-pointer. Misalnya, [aws. StringValue](https://docs.aws.amazon.com/sdk-for-go/api/aws/#StringValue)harus diperbarui ke`aws.ToString`. 

### Jenis Kesalahan
<a name="errors-types"></a>

 Ini AWS SDK untuk Go mengambil keuntungan penuh dari fungsionalitas pembungkus kesalahan yang [diperkenalkan di Go 1.13](https://go.dev/blog/go1.13-errors). Layanan yang memodelkan respons kesalahan telah menghasilkan jenis yang tersedia dalam `types` paket klien mereka yang dapat digunakan untuk menguji apakah kesalahan operasi klien disebabkan oleh salah satu jenis ini. Misalnya, `GetObject` operasi Amazon S3 dapat mengembalikan `NoSuchKey` kesalahan jika mencoba mengambil kunci objek yang tidak ada. [Anda dapat menggunakan [errors.as](https://pkg.go.dev/errors#As) untuk menguji apakah kesalahan operasi yang dikembalikan adalah tipe. NoSuchKey](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3/types#NoSuchKey)kesalahan. Jika layanan tidak memodelkan jenis tertentu untuk kesalahan, Anda dapat menggunakan [bengkel. APIError](https://pkg.go.dev/github.com/aws/smithy-go#APIError)jenis antarmuka untuk memeriksa kode kesalahan yang dikembalikan dan pesan dari layanan. Fungsionalitas ini menggantikan [awserr.Error](https://docs.aws.amazon.com/sdk-for-go/api/aws/awserr//#Error) dan fungsionalitas [awserr](https://docs.aws.amazon.com/sdk-for-go/api/aws/awserr/) lainnya dari v1. AWS SDK untuk Go Untuk informasi detail selengkapnya tentang penanganan kesalahan, lihat[Menangani Kesalahan di AWS SDK untuk Go V2](handle-errors.md). 

#### Contoh
<a name="example-6"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/awserr"
import "github.com/aws/aws-sdk-go/service/s3"

// ...

client := s3.New(sess)

output, err := s3.GetObject(&s3.GetObjectInput{
    // input parameters
})
if err != nil {
    if awsErr, ok := err.(awserr.Error); ok {
        if awsErr.Code() == "NoSuchKey" {
            // handle NoSuchKey
        } else {
            // handle other codes
        }
        return
    }
    // handle a error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/service/s3"
import "github.com/aws/aws-sdk-go-v2/service/s3/types"
import "github.com/aws/smithy-go"

// ...

client := s3.NewFromConfig(cfg)

output, err := client.GetObject(context.TODO(), &s3.GetObjectInput{
    // input parameters
})
if err != nil {
    var nsk *types.NoSuchKey
    if errors.As(err, &nsk) {
        // handle NoSuchKey error
        return
    }
    var apiErr smithy.APIError
    if errors.As(err, &apiErr) {
        code := apiErr.ErrorCode()
        message := apiErr.ErrorMessage()
        // handle error code
        return
    }
    // handle error
    return
}
```

### Paginator
<a name="paginators"></a>

 Paginator operasi layanan tidak lagi dipanggil sebagai metode pada klien layanan. Untuk menggunakan paginator untuk operasi Anda harus membangun paginator untuk operasi menggunakan salah satu metode konstruktor paginator. [Misalnya, untuk menggunakan paginate di atas operasi Amazon `ListObjectsV2` S3, Anda harus membuat paginatornya menggunakan s3. NewListObjectsV2Paginator](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#NewListObjectsV2Paginator). Konstruktor ini mengembalikan [ListObjectsV2Paginator](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#ListObjectsV2Paginator) yang menyediakan metode`HasMorePages`, dan `NextPage` untuk menentukan apakah ada lebih banyak halaman untuk mengambil dan menjalankan operasi untuk mengambil halaman berikutnya masing-masing. Rincian lebih lanjut tentang penggunaan paginator SDK dapat ditemukan di. [Menggunakan Operation Paginators](using.md#using-operation-paginators) 

 Mari kita lihat contoh cara bermigrasi dari paginator AWS SDK untuk Go v1 ke setara v2. AWS SDK untuk Go 

#### Contoh
<a name="example-7"></a>

```
// V1

import "fmt"
import "github.com/aws/aws-sdk-go/service/s3"

// ...

client := s3.New(sess)

params := &s3.ListObjectsV2Input{
    // input parameters
}

totalObjects := 0
err := client.ListObjectsV2Pages(params, func(output *s3.ListObjectsV2Output, lastPage bool) bool {
    totalObjects += len(output.Contents)
    return !lastPage
})
if err != nil {
    // handle error
}
fmt.Println("total objects:", totalObjects)
```

```
// V2

import "context"
import "fmt"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

client := s3.NewFromConfig(cfg)

params := &s3.ListObjectsV2Input{
    // input parameters
}

totalObjects := 0
paginator := s3.NewListObjectsV2Paginator(client, params)
for paginator.HasMorePages() {
    output, err := paginator.NextPage(context.TODO())
    if err != nil {
        // handle error
    }
    totalObjects += len(output.Contents)
}
fmt.Println("total objects:", totalObjects)
```

### Pelayan
<a name="waiters"></a>

 Pelayan operasi layanan tidak lagi dipanggil sebagai metode pada klien layanan. Untuk menggunakan pelayan, pertama-tama Anda membangun jenis pelayan yang diinginkan, dan kemudian memanggil metode tunggu. Misalnya, untuk menunggu Bucket Amazon S3 ada, Anda harus membuat pelayan. `BucketExists` Gunakan [s3. NewBucketExistsWaiter](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#NewBucketExistsWaiter)konstruktor untuk membuat [s3. BucketExistsWaiter](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#BucketExistsWaiter). `s3.BucketExistsWaiter`Ini menyediakan `Wait` metode yang dapat digunakan untuk menunggu ember tersedia. 

### Permintaan yang Ditandatangani
<a name="presigned-requests"></a>

 V1 SDK secara teknis mendukung presigning operasi AWS SDK *apa pun*, namun, ini tidak secara akurat mewakili apa yang sebenarnya didukung di tingkat layanan (dan pada kenyataannya sebagian besar operasi AWS layanan tidak mendukung presigning). 

 AWS SDK untuk Go menyelesaikan ini dengan mengekspos `PresignClient` implementasi spesifik dalam paket layanan dengan spesifik APIs untuk operasi presignable yang didukung. 

 **Catatan: Jika layanan tidak memiliki dukungan pra-penandatanganan untuk operasi yang berhasil Anda gunakan di SDK v1, beri tahu kami dengan [mengajukan masalah](https://github.com/aws/aws-sdk-go-v2/issues). GitHub** 

 Penggunaan [Presign](https://docs.aws.amazon.com/sdk-for-go/api/aws/request/#Request.Presign) dan [PresignRequest](https://docs.aws.amazon.com/sdk-for-go/api/aws/request/#Request.PresignRequest)harus dikonversi untuk menggunakan klien presigning khusus layanan. 

 Contoh berikut menunjukkan cara memigrasikan presigning permintaan GetObject S3: 

```
// V1

import (
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    svc := s3.New(sess)
    req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
        Bucket: aws.String("{{amzn-s3-demo-bucket}}"),
        Key:    aws.String("{{key}}"),
    })

    // pattern 1
    url1, err := req.Presign(20 * time.Minute)
    if err != nil {
        panic(err)
    }
    fmt.Println(url1)

    // pattern 2
    url2, header, err := req.PresignRequest(20 * time.Minute)
    if err != nil {
        panic(err)
    }
    fmt.Println(url2, header)
}
```

```
// V2

import (
    "context"
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    cfg, err := config.LoadDefaultConfig(context.Background())
    if err != nil {
        panic(err)
    }

    svc := s3.NewPresignClient(s3.NewFromConfig(cfg))
    req, err := svc.PresignGetObject(context.Background(), &s3.GetObjectInput{
        Bucket: aws.String("{{amzn-s3-demo-bucket}}"),
        Key:    aws.String("{{key}}"),
    }, func(o *s3.PresignOptions) {
        o.Expires = 20 * time.Minute
    })
    if err != nil {
        panic(err)
    }

    fmt.Println(req.Method, req.URL, req.SignedHeader)
}
```

## Minta kustomisasi
<a name="request-customization"></a>

 API [request.request](https://docs.aws.amazon.com/sdk-for-go/api/aws/request/#Request) monolitik telah dikotak-kotak-kotak ulang. 

### Input/output operasi
<a name="operation-inputoutput"></a>

 `Request`Bidang buram `Params` dan`Data`, yang masing-masing memegang struktur input dan output operasi, sekarang dapat diakses dalam fase middleware tertentu sebagai input/output: 

 Minta penangan yang mereferensikan `Request.Params` dan `Request.Data` harus dimigrasikan ke middleware. 

#### bermigrasi `Params`
<a name="migrating-params"></a>

```
// V1

import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/request"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func withPutObjectDefaultACL(acl string) request.Option {
    return func(r *request.Request) {
        in, ok := r.Params.(*s3.PutObjectInput)
        if !ok {
            return
        }

        if in.ACL == nil {
            in.ACL = aws.String(acl)
        }
        r.Params = in
    }
}

func main() {
    sess := session.Must(session.NewSession())
    sess.Handlers.Validate.PushBack(withPutObjectDefaultACL(s3.ObjectCannedACLBucketOwnerFullControl))

    // ...
}
```

```
// V2

import (
    "context"

    "github.com/aws/aws-sdk-go-v2/service/s3"
    "github.com/aws/aws-sdk-go-v2/service/s3/types"
    "github.com/aws/smithy-go/middleware"
    smithyhttp "github.com/aws/smithy-go/transport/http"
)

type withPutObjectDefaultACL struct {
    acl types.ObjectCannedACL
}

// implements middleware.InitializeMiddleware, which runs BEFORE a request has
// been serialized and can act on the operation input
var _ middleware.InitializeMiddleware = (*withPutObjectDefaultACL)(nil)

func (*withPutObjectDefaultACL) ID() string {
    return "withPutObjectDefaultACL"
}

func (m *withPutObjectDefaultACL) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (
    out middleware.InitializeOutput, metadata middleware.Metadata, err error,
) {
    input, ok := in.Parameters.(*s3.PutObjectInput)
    if !ok {
        return next.HandleInitialize(ctx, in)
    }

    if len(input.ACL) == 0 {
        input.ACL = m.acl
    }
    in.Parameters = input
    return next.HandleInitialize(ctx, in)
}

// create a helper function to simplify instrumentation of our middleware
func WithPutObjectDefaultACL(acl types.ObjectCannedACL) func (*s3.Options) {
    return func(o *s3.Options) {
        o.APIOptions = append(o.APIOptions, func (s *middleware.Stack) error {
            return s.Initialize.Add(&withPutObjectDefaultACL{acl: acl}, middleware.After)
        })
    }
}

func main() {
    cfg, err := config.LoadDefaultConfig(context.Background())
    if err != nil {
        // ...
    }

    svc := s3.NewFromConfig(cfg, WithPutObjectDefaultACL(types.ObjectCannedACLBucketOwnerFullControl))
    // ...
}
```

#### bermigrasi `Data`
<a name="migrating-data"></a>

```
// V1

import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/request"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func readPutObjectOutput(r *request.Request) {
        output, ok := r.Data.(*s3.PutObjectOutput)
        if !ok {
            return
        }

        // ...
    }
}

func main() {
    sess := session.Must(session.NewSession())
    sess.Handlers.Unmarshal.PushBack(readPutObjectOutput)

    svc := s3.New(sess)
    // ...
}
```

```
// V2

import (
    "context"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
    "github.com/aws/smithy-go/middleware"
    smithyhttp "github.com/aws/smithy-go/transport/http"
)

type readPutObjectOutput struct{}

var _ middleware.DeserializeMiddleware = (*readPutObjectOutput)(nil)

func (*readPutObjectOutput) ID() string {
    return "readPutObjectOutput"
}

func (*readPutObjectOutput) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (
    out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
) {
    out, metadata, err = next.HandleDeserialize(ctx, in)
    if err != nil {
        // ...
    }

    output, ok := in.Parameters.(*s3.PutObjectOutput)
    if !ok {
        return out, metadata, err
    }

    // inspect output...

    return out, metadata, err
}

func WithReadPutObjectOutput(o *s3.Options) {
    o.APIOptions = append(o.APIOptions, func (s *middleware.Stack) error {
        return s.Initialize.Add(&withReadPutObjectOutput{}, middleware.Before)
    })
}

func main() {
    cfg, err := config.LoadDefaultConfig(context.Background())
    if err != nil {
        // ...
    }

    svc := s3.NewFromConfig(cfg, WithReadPutObjectOutput)
    // ...
}
```

### Permintaan/tanggapan HTTP
<a name="http-requestresponse"></a>

 `HTTPResponse`Bidang `HTTPRequest` dan dari sekarang `Request` diekspos dalam fase middleware tertentu. Karena middleware adalah transport-agnostik, Anda harus melakukan pernyataan tipe pada input atau output middleware untuk mengungkapkan permintaan atau respons HTTP yang mendasarinya. 

 Minta penangan yang mereferensikan `Request.HTTPRequest` dan `Request.HTTPResponse` harus dimigrasikan ke middleware. 

#### bermigrasi `HTTPRequest`
<a name="migrating-httprequest"></a>

```
// V1

import (
    "github.com/aws/aws-sdk-go/aws/request"
    "github.com/aws/aws-sdk-go/aws/session"
)

func withHeader(header, val string) request.Option {
    return func(r *request.Request) {
        request.HTTPRequest.Header.Set(header, val)
    }
}

func main() {
    sess := session.Must(session.NewSession())
    sess.Handlers.Build.PushBack(withHeader("x-user-header", "..."))

    svc := s3.New(sess)
    // ...
}
```

```
// V2

import (
    "context"
    "fmt"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
    "github.com/aws/smithy-go/middleware"
    smithyhttp "github.com/aws/smithy-go/transport/http"
)

type withHeader struct {
    header, val string
}

// implements middleware.BuildMiddleware, which runs AFTER a request has been
// serialized and can operate on the transport request
var _ middleware.BuildMiddleware = (*withHeader)(nil)

func (*withHeader) ID() string {
    return "withHeader"
}

func (m *withHeader) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
    out middleware.BuildOutput, metadata middleware.Metadata, err error,
) {
    req, ok := in.Request.(*smithyhttp.Request)
    if !ok {
        return out, metadata, fmt.Errorf("unrecognized transport type %T", in.Request)
    }

    req.Header.Set(m.header, m.val)
    return next.HandleBuild(ctx, in)
}

func WithHeader(header, val string) func (*s3.Options) {
    return func(o *s3.Options) {
        o.APIOptions = append(o.APIOptions, func (s *middleware.Stack) error {
            return s.Build.Add(&withHeader{
                header: header,
                val: val,
            }, middleware.After)
        })
    }
}

func main() {
    cfg, err := config.LoadDefaultConfig(context.Background())
    if err != nil {
        // ...
    }

    svc := s3.NewFromConfig(cfg, WithHeader("x-user-header", "..."))
    // ...
}
```

### Fase handler
<a name="handler-phases"></a>

 Fase middleware SDK v2 adalah penerus fase handler v1. 

 Tabel berikut menyediakan pemetaan kasar fase handler v1 ke lokasi yang setara dalam tumpukan middleware V2: 


|  nama handler v1  |  fase middleware v2  | 
| --- | --- | 
|  Validasi  |  Inisialisasi  | 
|  Membangun  |  Serialisasi  | 
|  Sign  |  Selesaikan  | 
|  Kirim  |  n/a (1)  | 
|  ValidateResponse  |  Deserialisasi  | 
|  Unmarshal  |  Deserialisasi  | 
|  UnmarshalMetadata  |  Deserialisasi  | 
|  UnmarshalError  |  Deserialisasi  | 
|  Coba lagi  |  Selesaikan, setelah "Retry" middleware (2)  | 
|  AfterRetry  |  Selesaikan, sebelum "Retry" middleware, post- next.HandleFinalize() (2,3)  | 
|  CompleteAttempt  |  Selesaikan, akhir langkah  | 
|  Selesai  |  Inisialisasi, mulai langkah, posting- next.HandleInitialize() (3)  | 

 (1) `Send` Fase di v1 secara efektif adalah pulang-pergi klien HTTP yang dibungkus di v2. Perilaku ini dikendalikan oleh `HTTPClient` bidang pada opsi klien. 

 (2) Setiap middleware setelah `"Retry"` middleware di langkah Finalize akan menjadi bagian dari loop coba lagi. 

 (3) “Tumpukan” middleware pada waktu operasi dibangun ke dalam fungsi handler yang didekorasi berulang kali. Setiap pawang bertanggung jawab untuk memanggil yang berikutnya dalam rantai. Ini secara implisit berarti bahwa langkah middleware juga dapat mengambil tindakan SETELAH langkah selanjutnya dipanggil. 

 Misalnya, untuk langkah Inisialisasi, yang berada di bagian atas tumpukan, ini berarti Inisialisasi middlewares yang mengambil tindakan setelah memanggil handler berikutnya beroperasi secara efektif di akhir permintaan: 

```
// V2

import (
    "context"

    "github.com/aws/smithy-go/middleware"
)

type onComplete struct{}

var _ middleware.InitializeMiddleware = (*onComplete)(nil)

func (*onComplete) ID() string {
    return "onComplete"
}

func (*onComplete) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (
    out middleware.InitializeOutput, metadata middleware.Metadata, err error,
) {
    out, metadata, err = next.HandleInitialize(ctx, in)

    // the entire operation was invoked above - the deserialized response is
    // available opaquely in out.Result, run post-op actions here...

    return out, metadata, err
}
```

## Fitur
<a name="features"></a>

### Layanan EC2 Metadata Instans Amazon
<a name="ec2-instance-metadata-service"></a>

 AWS SDK untuk Go Ini menyediakan klien Amazon EC2 Instance Metadata Service (IMDS) yang dapat Anda gunakan untuk menanyakan IMDS lokal saat menjalankan aplikasi Anda di instans Amazon. EC2 Klien IMDS adalah modul Go terpisah yang dapat ditambahkan ke aplikasi Anda dengan menggunakan 

```
go get github.com/aws/aws-sdk-go-v2/feature/ec2/imds
```

 Konstruktor klien dan operasi metode telah diperbarui agar sesuai dengan desain klien layanan SDK lainnya. 

#### Contoh
<a name="example-8"></a>

```
// V1

import "github.com/aws/aws-sdk-go/aws/ec2metadata"

// ...

client := ec2metadata.New(sess)

region, err := client.Region()
if err != nil {
    // handle error
}
```

```
// V2

import "context"
import "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"

// ...

client := imds.NewFromConfig(cfg)

region, err := client.GetRegion(context.TODO())
if err != nil {
    // handle error
}
```

### Manajer Transfer Amazon S3
<a name="s3-transfer-manager"></a>

 Manajer transfer Amazon S3 tersedia untuk mengelola unggahan dan unduhan objek secara bersamaan. Paket ini terletak di modul Go di luar jalur impor klien layanan. Modul ini dapat diambil dengan menggunakan`go get github.com/aws/aws-sdk-go-v2/feature/s3/manager`. 

 [s3. NewUploader](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#NewUploader)dan [s3. NewUploaderWithClient](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#NewUploaderWithClient)telah diganti dengan [manajer metode konstruktor. NewUploader](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/feature/s3/manager#)untuk membuat klien pengelola Unggah. 

 [s3. NewDownloader](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#NewDownloader)dan [s3. NewDownloaderWithClient](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#NewDownloaderWithClient)telah diganti dengan [manajer metode konstruktor tunggal. NewDownloader](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/feature/s3/manager#NewDownloader)untuk membuat klien Download manager. 

### Utilitas CloudFront Penandatanganan Amazon
<a name="cflong-signing-utilities"></a>

 AWS SDK untuk Go Ini menyediakan utilitas CloudFront penandatanganan Amazon dalam modul Go di luar jalur impor klien layanan. Modul ini dapat diambil dengan menggunakan`go get`. 

```
go get github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign
```

### Klien Enkripsi Amazon S3
<a name="s3-encryption-client"></a>

 Mulai tahun AWS SDK untuk Go, klien enkripsi Amazon S3 adalah modul terpisah di bawah [AWS Crypto](https://docs.aws.amazon.com/aws-crypto-tools) Tools. Versi terbaru dari klien enkripsi S3 untuk Go, 3.x, sekarang tersedia di. [GitHub](https://github.com/aws/amazon-s3-encryption-client-go) Modul ini dapat diambil dengan menggunakan`go get`: 

```
go get github.com/aws/amazon-s3-encryption-client-go/v3
```

 Yang terpisah `EncryptionClient` ([v1](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3crypto/#EncryptionClient), [v2](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3crypto/#EncryptionClientV2)) dan `DecryptionClient` ([v1](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3crypto/#DecryptionClient), [v2](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3crypto/#DecryptionClientV2)) APIs telah diganti dengan satu klien, [S3 EncryptionClient V3](https://pkg.go.dev/github.com/aws/amazon-s3-encryption-client-go/v3/client#S3EncryptionClientV3), yang memperlihatkan fungsionalitas enkripsi dan dekripsi. 

 Seperti klien layanan lainnya AWS SDK untuk Go, operasi APIs telah diringkas: 
+  The`GetObject`,`GetObjectRequest`, dan `GetObjectWithContext` dekripsi APIs diganti dengan. [GetObject](https://pkg.go.dev/github.com/aws/amazon-s3-encryption-client-go/v3/client#S3EncryptionClientV3.GetObject) 
+  `PutObjectWithContext`Enkripsi `PutObject``PutObjectRequest`,, dan APIs digantikan oleh [PutObject](https://pkg.go.dev/github.com/aws/amazon-s3-encryption-client-go/v3/client#S3EncryptionClientV3.PutObject). 

 Untuk mempelajari cara bermigrasi ke versi utama 3.x klien enkripsi, lihat panduan [ini](https://docs.aws.amazon.com/amazon-s3-encryption-client/latest/developerguide/go-v3-migration.html). 

## Perubahan Kustomisasi Layanan
<a name="service-customizations-changes"></a>

### Amazon S3
<a name="s3"></a>

 Saat bermigrasi dari AWS SDK untuk Go v1 ke v2, perubahan penting yang harus diperhatikan melibatkan penanganan yang `SSECustomerKey` digunakan untuk enkripsi sisi server dengan kunci yang disediakan pelanggan (SSE-C). Di AWS SDK untuk Go v1, pengkodean `SSECustomerKey` to Base64 ditangani secara internal oleh SDK. Di SDK v2, pengkodean otomatis ini telah dihapus, dan sekarang diperlukan untuk menyandikan secara manual ke Base64 sebelum meneruskannya `SSECustomerKey` ke SDK. 

 Contoh Penyesuaian: 

```
// V1

import (
  "context"
  "encoding/base64"
  "github.com/aws/aws-sdk-go-v2/config"
  "github.com/aws/aws-sdk-go-v2/service/s3"
)
// ... more code

plainTextKey := "12345678901234567890123456789012" // 32 bytes in length

// calculate md5..

_, err = client.PutObjectWithContext(context.Background(), &s3.PutObjectInput{
    Bucket: aws.String("{{amzn-s3-demo-bucket}}"),
    Key:    aws.String("{{your-object-key}}"),
    Body:                 strings.NewReader("hello-world"),
    SSECustomerKey:       &plainTextKey,
    SSECustomerKeyMD5:    &base64Md5,
    SSECustomerAlgorithm: aws.String("AES256"),
})

// ... more code
```

```
// V2

import (
  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/service/s3"
)

// ... more code

plainTextKey := "12345678901234567890123456789012" // 32 bytes in length
base64EncodedKey := base64.StdEncoding.EncodeToString([]byte(plainTextKey))

// calculate md5..

_, err = client.PutObject(context.Background(), &s3.PutObjectInput{
    Bucket: aws.String("{{amzn-s3-demo-bucket}}"),
    Key:    aws.String("{{your-object-key}}"),
    Body:                 strings.NewReader("hello-world"),
    SSECustomerKey:       &base64EncodedKey,
    SSECustomerKeyMD5:    &base64Md5,
    SSECustomerAlgorithm: aws.String("AES256"),
})

// ... more code
```