株式会社readytowork

アイコンプラチナ
東京都

Go言語によるAmazon S3実装ガイド

Amazon Simple Storage Service (S3) は、開発者がいつでも任意の量のデータを保存および取得できる、広く利用されているクラウドストレージソリューションです。このガイドでは、AWS SDK for Go V2 を使用して Go (Golang) アプリケーションに Amazon S3 を統合する方法を順を追って説明します。このチュートリアルでは、AWS 認証情報の設定、ファイルのアップロード、事前署名済み URL の生成、Go 言語での権限処理について取り上げます。さらに、チュートリアルでは AWS コンソールから効果的な S3 バケットを設定する方法もガイドします。Enter キーを押すかクリックして画像をフルサイズで表示

前提条件

開始前に、以下の準備が整っていることを確認してください:

  • AWSアカウント:S3へのアクセス権限を持つ有効なAWSアカウント。

  • AWS認証情報:AWS CLIまたは環境変数を使用してAWS認証情報を設定してください。

  • Go環境:Go(バージョン1.15以降)がインストールされていること。

Goプロジェクトを初期化してください。

go mod init fileuploader

Install required dependencies for go v2

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

go get github.com/aws/aws-sdk-go-v2/configgo get github.com/aws/aws-sdk-go-v2/credentialsgo get github.com/aws/aws-sdk-go-v2/feature/s3/managergo get github.com/aws/aws-sdk-go-v2/service/s3

AWS S3 バケットの設定

AWS コンソールにアクセスし、S3を検索します。
バケットを作成します。
Enterキーを押すかクリックして画像をフルサイズで表示します。

画像

Enterキーを押すかクリックして画像をフルサイズで表示

画像

Press enter or click to view image in full size

画像

バケット作成後、AWSプログラムアクセスユーザーに対するアクセスポリシーを設定する必要があります。そのためには、バケットの詳細画面の「権限」セクションに移動し、バケットポリシーを追加します。Enterキーを押すか、画像をクリックしてフルサイズで表示してください。

画像
{
    "Version": "2012-10-17",
    "Id": "Policy1741260717481",
    "Statement": [
        {
            "Sid": "Stmt1741260713124",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::047719652545:user/cli-user"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::trouble-storage-bucket",
                "arn:aws:s3:::trouble-storage-bucket/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "public-read"
                }
            }
        }
    ]
}

オブジェクトの所有権については、ACLを有効にする必要があります。Enterキーを押すかクリックして画像をフルサイズで表示してください

画像

書き込みアクセス権を持つバケットの作成に成功しました。次に、Go言語におけるAWS S3の実装コードを見ていきましょう。

Go言語でのAWS S3設定

ステップ1: AWS SDKとS3クライアントの初期化

AWS SDKを設定し、S3クライアントを初期化するinit関数を作成します。

package main

import (
 "context"
 "fmt"
 "log"
 "mime/multipart"
 "net/http"
 "os"
 "time"

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

const (
 BucketName = "storagebucket"
 Region     = "region"
 AccessKey  = "Access_key"
 SecretKey  = "Secret Key"
)

var uploader *manager.Uploader
var client *s3.Client

func init() {
 cfg, err := config.LoadDefaultConfig(context.TODO(),
  config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
   AccessKey,
   SecretKey,
   "",
  )),
  config.WithRegion(Region),
 )
 if err != nil {
  log.Fatalf("Failed to load AWS SDK config: %v", err)
 }

 // Create S3 client and uploader gloabally so it can be used.
 client = s3.NewFromConfig(cfg)
 uploader = manager.NewUploader(client)
}

ステップ2: S3へのファイルアップロード

関数`uploadFileToS3`はファイルを受け取り、指定されたS3バケットにアップロードします。

func uploadFileToS3(file multipart.File, fileHeader *multipart.FileHeader) (string, error) {
 // Upload input
 uploadInput := &s3.PutObjectInput{
  Bucket:      aws.String(BucketName),
  Key:         aws.String(fileHeader.Filename),
  Body:        file,
  ContentType: aws.String(fileHeader.Header.Get("Content-Type")),
 }

 // Upload file
 result, err := uploader.Upload(context.TODO(), uploadInput)
 if err != nil {
  return "", fmt.Errorf("failed to upload file to S3: %w", err)
 }

 // getsigned url
 fmt.Println("result.Location ::", *result.Key)
 url, err := GetPresignedURL(fileHeader.Filename)
 return url, nil
}

ステップ3: 事前署名済みURLの生成

事前署名済みURLを使用すると、認証情報を公開することなく、S3オブジェクトへの一時的なアクセスが可能になります。


func GetPresignedURL(fileName string) (string, error) {
 presigner := s3.NewPresignClient(client)
 // Generate a pre-signed URL for PUT (upload)
 presignedReq, err := presigner.PresignGetObject(context.TODO(), &s3.GetObjectInput{
  Bucket: aws.String(BucketName),
  Key:    aws.String(fileName),
 }, s3.WithPresignExpires(15*time.Minute)) // URL expires in 15 minutes

 if err != nil {
  return "", fmt.Errorf("failed to create presigned URL: %w", err)
 }
 fmt.Println("presignedURL ::", presignedReq.URL)

 return presignedReq.URL, nil
}

ステップ4: 簡易HTTPサーバーの実行

HTTPリクエストによるファイルアップロードを受け付けるには、アップロードハンドラーを作成し、HTTPサーバーを起動します。

func main() {
 http.HandleFunc("/upload", UploadHandler)

 port := os.Getenv("PORT")
 if port == "" {
  port = "8080"
 }
 log.Println("Server running on port:", port)
 log.Fatal(http.ListenAndServe(":"+port, nil))
}

以下はアップロードAPIのアップロードハンドラーです

// UploadHandler handles file upload to S3
func UploadHandler(w http.ResponseWriter, r *http.Request) {
 if r.Method != http.MethodPost {
  http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
  return
 }

 // Parse the multipart form
 err := r.ParseMultipartForm(10 << 20) // 10 MB max file size
 if err != nil {
  http.Error(w, "Failed to parse form", http.StatusBadRequest)
  return
 }

 // Retrieve the file
 file, fileHeader, err := r.FormFile("file")
 if err != nil {
  http.Error(w, "Failed to get file", http.StatusBadRequest)
  return
 }
 defer file.Close()

 // Upload file to S3
 fileURL, err := uploadFileToS3(file, fileHeader)
 if err != nil {
  fmt.Println("Error ::", err.Error())
  http.Error(w, "Failed to upload file to S3", http.StatusInternalServerError)
  return
 }

 // Return the file URL
 w.WriteHeader(http.StatusOK)
 fmt.Fprintf(w, `{"message": "File uploaded successfully", "url": "%s"}`, fileURL)
}

プロジェクトを実行してくださいgo run fileuploader.goEnterキーを押すかクリックして画像をフルサイズで表示

画像

以下はPostmanでのAPI呼び出しですEnterキーを押すかクリックして画像をフルサイズで表示

画像

おめでとうございます!AWS S3とGoの統合に成功しました。このチュートリアルでは以下の内容を扱いました:

  • AWSでのS3設定

  • Go言語コードをS3バケットに実装
    S3バケットへのファイルアップロード
    安全なアクセス用事前署名済みURLの生成
    HTTPファイルアップロードの処理

これらの手順を実装することで、Goアプリケーションにおけるファイルのアップロードと取得を効率的に管理できます。

プログラミングを楽しんでください

参考:https://github.com/bhattaraibishal50/aws-s3-uploader


協業開発及び開発パートナーをお探しのお客様へ

弊社は、ネパールに海外拠点を持ち、生成AI、モバイルアプリ、システム開発を中心に事業を展開する企業です。
自社サービスの開発経験を活かし、クライアント様と共に事業を創造することを重視し、創業以来、スタートアップから中小企業、大手企業、自治体まで、幅広い開発実績があります。プロダクトはユーザーが使いやすいように設計しており、企画から開発、保守運用まで対応しています。開発技術を厳選し限定することで、セキュリティ、プロダクトの品質向上に努めており、事業開発に関する課題を深く理解し、最適なご提案が可能です
お問い合わせはこちらから:
お問い合わせフォーム:https://readytowork.jp/
直通番号:080-8940-7169

ご相談はこちらから

企画や要件が固まっていないご相談でも
お気軽にお問い合わせください。

  1. 01

    相談する

  2. 02

    要件ヒアリング

  3. 03

    専門企業のご紹介

  4. 04

    企業との
    ご面談&見積取得

  5. 05

    企業選定〜契約締結
    サポート

  6. 06

    専門企業と直接
    プロジェクト進行

※ステップ5以降はご希望に応じて
サポートいたします。

お急ぎの方はお電話で

03-6427-5422

サポートデスク直通(平日10:00〜18:00)

必須お名前
必須メールアドレス
必須電話番号
必須会社名
任意依頼内容・希望
利用規約及び、個人情報保護方針にご同意のうえ、送信ください。

申し込み完了後、サポートデスクから
お電話またはメールにてご連絡させていただきます。

本サイトは、reCAPTCHAとGoogleにより保護されています。(プライバシーポリシー利用規約)

EDITOR PROFILE

株式会社readytowork

東 スシル

システムテスターとしてIT業界でキャリアをスタートし、その後PMOとして、基幹システム、モバイルアプリ、ヘルスケア、教育、ECサイトなど、幅広い領域で30以上のプロダクトをリリースしてきました。

創業以来、自社サービスの開発から、スタートアップ、中小企業、大手企業、自治体様のシステム開発に取り組み、共に事業の成長を目指しています。

お客様の実現したいビジョンを深く理解し、そのニーズに最適な提案をさせていただきます。
ぜひ、お気軽にお問い合わせください。

株式会社readytowork

東京都
スマホアプリ開発 WEBサービス開発 ホームページ・WEBサイト制作

株式会社readytoworkでできること

  • スマホアプリ開発

    iOS、Andoroidの各単体での開発実績がございます。アプリの開発には、企画、設計、申請、保守など様々なプロセスがあリます。私たちはアプリ開発とその後の運営までしっかりとサポートさせていただきます。

  • WEBサービス開発

    WEBサービス開発は豊富な実績があります。例えば、データベースとWebシステムを組み合わせたシステム開発が該当します。私達が採用しているWebシステム開発言語である「PHP」や「GO言語」は柔軟な開発言語で、Webシステムの改良・新たな機能追加を容易に行うことができます。 システム運用をとめずに、新たな要望や機能の追加が可能です。お客様のご要望に合わせたシステム開発をさせていただきますのでご安心ください。

  • ホームページ・WEBサイト制作

    売上向上、採用強化、ブランディングを実現するホームページを制作します。100%内製での制作だからこそできる質とスピードを実現します。デザイン、サイト内の原稿、SEO対策など、Webサイトに必要な要素は全て、当社からご提案させていただきます。

会社選び・業者探しに迷った方はこちら
ご要望にあった会社を無料でご紹介いたします!
専門のサポートデスクがヒアリングを行い、
要件にあった最適な企業・業者をご紹介いたします。
ご要望にあった会社を無料でご紹介いたします