Upgrade to Pro — share decks privately, control downloads, hide ads and more …

aws-sdk-go-v2入門 MediaDo.go

ogady
September 25, 2020

aws-sdk-go-v2入門 MediaDo.go

ogady

September 25, 2020
Tweet

More Decks by ogady

Other Decks in Programming

Transcript

  1. aws-sdk-go-v2入門
    MediaDo.go#2
    2020.09.25

    View full-size slide

  2. 株式会社メディアドゥ所属
    - バックエンド、インフラエンジニア
    Name :
    Takumi Ogawa
    Twitter: @_ogady_

    View full-size slide

  3. 1. aws-sdk-goとは
    2. aws-sdk-go-v2とは
    3. aws-sdk-goとの違い
    4. aws-sdk-go-v2を使ってみる
    5. 最後に

    View full-size slide

  4. aws-sdk-go、
    使ってますか?
    Q

    View full-size slide

  5. 1
    aws-sdk-goとは

    View full-size slide

  6. aws-sdk-goとは
    ● おなじみGo言語用のAWS SDK
    ● 認証・リクエストの再試行・エラー処理など、低レイ
    ヤーの処理をよしなにラッピングしてくれる
    ● goroutineを使用したS3との大容量ファイル受け渡しな
    どのAWS連携が簡単にできる

    View full-size slide

  7. 2
    aws-sdk-go-v2とは

    View full-size slide

  8. aws-sdk-go-v2とは
    ● 現行提供されているaws-sdk-goの後継
    ● パフォーマンス・一貫性・使いやすさなどを改善
    ● 2017年12月22日より開発者プレビュー版がリリース
    →2020年9月25日現在も開発者プレビュー版のみの提供

    View full-size slide

  9. 3
    aws-sdk-goとの違い

    View full-size slide

  10. ● sessionではなくexternalパッケージを使用する
    ● 現行のsessionパッケージとcredentialパッケージの機能
    がv2ではexternalパッケージに集約され、わかりやすく
    なっている
    ● クライアントはaws.Configのみを使用して生成する。
    →従来のaws.Configを生成してsession.New()する手順か
    ら、よりシンプルになった
    ・サービスクライアント生成方法の違い
    aws-sdk-goとの違い

    View full-size slide

  11. aws-sdk-go
    sess := session.Must(
    session.NewSession()
    )
    // S3クライアントを作成
    svc := s3.New(sess)
    aws-sdk-go-v2
    aws-sdk-goとの違い
    ・サービスクライアント生成方法の違い
    cfg, err := external.LoadDefaultAWSConfig()
    if err != nil {
    panic( err)
    }
    // S3クライアントを作成
    svc := s3.New(cfg)
    ※上記はおおむね同じ挙動

    View full-size slide

  12. ● Send()メソッドを使用し、リクエストを送信する
    ● APIインプット構造体をRequest()に渡すのは現行と同じ
    ● APIコール形式が各サービスで統一されているため、わ
    かりやすくなった
    →各API要求メソッドはサフィックスに”Request”がつ
    いている、Send()メソッドでAPIコールする、など
    ・APIリクエスト発行の違い
    aws-sdk-goとの違い

    View full-size slide

  13. aws-sdk-go
    svc := s3.New(sess)
    res, err := svc.GetObjectWithContext(
    context.TODO(),
    &s3.GetObjectInput{
    Bucket: aws.String(bucket),
    Key: aws.String(key)}
    )
    }
    aws-sdk-go-v2
    aws-sdk-goとの違い
    ・APIリクエスト発行の違い
    svc := s3.New(cfg)
    req := svc.GetObjectRequest(
    &s3.GetObjectInput{
    Bucket: aws.String(bucketName),
    Key: aws.String(key)}
    )
    res, err := req.Send(context.TODO())

    View full-size slide

  14. ● APIインプット構造体のフィールドに型指定された列挙
    値を使用する
    →この変更により、文字列を直接使用することがなくな
    り、より型安全に使用できる
    ● 列挙値を使用する際に、APIインプットのフィールドを
    ポインタ型にする必要がなくなった
    aws-sdk-goとの違い
    ・APIインプット構造体に型指定された列挙値を提供

    View full-size slide

  15. const (
    ObjectCannedACLPrivate = "private"
    // 一部省略
    }
    aws-sdk-go
    type PutObjectInput struct {
    // 一部省略
    ACL *string
    }
    aws-sdk-go-v2
    aws-sdk-goとの違い
    type PutObjectInput struct {
    // 一部省略
    ACL ObjectCannedACL
    }
    type ObjectCannedACL string
    const (
    ObjectCannedACLPrivate ObjectCannedACL =
    "private" // 一部省略
    }
    ・APIインプット構造体に型指定された列挙値を提供(内部実装比較)

    View full-size slide

  16. aws-sdk-go
    input := &s3.PutObjectInput{
    Bucket: aws.String("myBucket"),
    Key: aws.String("myKey"),
    ACL: aws.String(
    s3.ObjectCannedACLPrivate
    ),
    Body: file,
    }
    aws-sdk-go-v2
    aws-sdk-goとの違い
    ・APIインプット構造体に型指定された列挙値を提供
    input := &s3.PutObjectInput{
    Bucket: aws.String("myBucket"),
    Key: aws.String("myKey"),
    ACL: s3.ObjectCannedACLPrivate,
    Body: file,
    }

    View full-size slide

  17. ● APIインプット構造体のフィールドでスライス要素と
    マップ要素を値型からポインタ型に変換する必要がなく
    なった
    ・APIスライス、マップ要素指定の違い
    aws-sdk-goとの違い

    View full-size slide

  18. aws-sdk-go
    type AddPermissionInput struct {
    _ struct{}
    AWSAccountIds []*string
    // 一部省略
    }
    aws-sdk-go-v2
    aws-sdk-goとの違い
    ・APIスライス、マップ要素指定の違い(内部実装比較)
    type AddPermissionInput struct {
    _ struct{}
    AWSAccountIds []string
    // 一部省略
    }

    View full-size slide

  19. input := &sqs.AddPermissionInput{
    AWSAccountIds: []string{
    "123456789",
    },
    Actions: []string{
    "SendMessage",
    },
    // 一部省略
    }
    aws-sdk-go
    input := &sqs.AddPermissionInput{
    AWSAccountIds: []*string{
    aws.String("123456789"),
    },
    Actions: []*string{
    aws.String("SendMessage"),
    },
    // 一部省略
    }
    aws-sdk-go-v2
    aws-sdk-goとの違い
    ・APIスライス、マップ要素指定の違い

    View full-size slide

  20. 4
    aws-sdk-go-v2を
    使ってみる

    View full-size slide

  21. cfg, err = external.LoadDefaultAWSConfig()
    cfg, err = external.LoadDefaultAWSConfig(
    external.WithSharedConfigProfile("example-profile-name"),
    )
    cfg, err := external.LoadDefaultAWSConfig(
    external.WithCredentialsProvider{
    CredentialsProvider: aws.StaticCredentialsProvider{
    Value: aws.Credentials{
    AccessKeyID: "AKID", SecretAccessKey: "SECRET", SessionToken: "SESSION",
    Source: "example hard coded credentials" }}})
    aws-sdk-go-v2を使ってみる
    ・Config情報取得
    defaultの認証情報を
    使用するパターン
    認証設定ファイルの
    任意の認証情報を使
    用するパターン
    認証情報を直接指定
    するパターン

    View full-size slide

  22. ・S3へファイルアップロード
    aws-sdk-go-v2を使ってみる
    svc := s3.New(cfg)
    input := &s3.PutObjectInput{
    Body: bytes.NewReader(file),
    Bucket: aws.String(“bucketName”),
    Key: aws.String(“key”),
    ACL: s3.ObjectCannedACLPublicRead,
    }
    req := svc.PutObjectRequest(input)
    _, err := req.Send(context.TODO())
    if err != nil {
    return fmt.Errorf("failed to put s3 object with key '%s' %w", key, err)
    }
    前のスライドで生成した
    aws.Configを渡す
    リクエストを送信する

    View full-size slide

  23. ・SQSへメッセージ送信
    aws-sdk-go-v2を使ってみる
    svc := sqs.New(cfg)
    input := &sqs.SendMessageInput{
    MessageBody: aws.String(“Message”),
    QueueUrl: aws.String(“exampleURL”),
    }
    req := svc.SendMessageRequest(input)
    _, err := req.Send(context.TODO())
    if err != nil {
    return fmt.Errorf("failed to send sqs %w", err)
    }
    前のスライドで生成した
    aws.Configを渡す
    リクエストを送信する

    View full-size slide

  24. ● 確実にわかりやすくなってる(と思う)
    ● 内部実装も綺麗になったので、困った時に調査しやすい
    ● とはいえ開発者プレビュー版なので計画的にご利用くだ
    さい…
    最後に

    View full-size slide

  25. 良きaws with goライフを!
    contact me at @_ogady_
    Thanks ! !

    View full-size slide