AWS S3 Kullanımı: Spring Boot ile Resim Upload ve Depolama Rehberi



AWS S3 (Amazon Simple Storage Service) bir bulut depolama servisidir ve neredeyse her türlü veriyi saklamak için kullanılabilir. S3, kullanıcıların verilerini güvenli, dayanıklı ve yüksek erişilebilirlikte depolamalarına olanak tanır. İşte AWS S3'te saklayabileceğiniz bazı veri türleri:


Web Siteleri: Statik web siteleri veya web uygulamaları için içerik (HTML, CSS, JavaScript dosyaları gibi).

Medya Dosyaları: Resimler, videolar, müzik dosyaları gibi büyük medya dosyaları.

Yedekler: Sunucu, veritabanı veya uygulama yedekleri gibi kritik verilerin yedeklenmesi.

Arşivler ve Log Dosyaları: Log kayıtları, eski dosyalar, arşivlenmiş veriler gibi büyük miktarda verinin uzun vadeli saklanması.

Uygulama Verileri: Mobil ve web uygulamalarından gelen veriler, kullanıcı profilleri, oyun kayıtları gibi dinamik içerikler.

Büyük Veri Analizi için Veriler: Veri analizi, makine öğrenimi modelleri için eğitim verileri, IoT cihazlarından gelen veriler gibi çeşitli kaynaklardan toplanan veriler.

Yazılım ve Uygulamalar: Uygulama paketleri, yazılım güncellemeleri, dağıtılabilir dosyalar gibi yazılım geliştirme dosyaları.

Veritabanı Dökümleri: SQL dökümleri, NoSQL veritabanı yedekleri gibi veritabanı verileri.

AWS S3, yüksek düzeyde esneklik ve ölçeklenebilirlik sunar; bu, kullanıcıların ihtiyaç duydukları kadar depolama alanını kullanmalarına ve yalnızca kullandıkları kadar ödeme yapmalarına olanak tanır. S3, veri güvenliği ve gizliliği sağlamak için çeşitli şifreleme ve izin seçenekleri sunar. Kullanıcılar, verilerini dünya genelinde birden fazla coğrafi bölgede depolayarak yüksek düzeyde dayanıklılık ve erişilebilirlik sağlayabilirler.


User

Dosyalar için public download linki oluşturabilir miyim?

ChatGPT

Evet, AWS S3'te depolanan dosyalar için genel olarak erişilebilir indirme bağlantıları oluşturabilirsiniz. Bu, dosyalarınızı internet üzerinden herkese açık bir şekilde paylaşmanıza olanak tanır. Genel erişim linki oluşturmanın birkaç yolu vardır:


S3 Management Console Kullanarak:

AWS Management Console'a gidin ve S3 servisine erişin.

Genel erişim vermek istediğiniz dosyayı barındıran bucket'ı seçin.

Dosyayı bulun, seçin ve Actions (Eylemler) menüsünden Make public (Herkese açık yap) seçeneğini belirleyin.

Dosyanın Properties (Özellikler) sekmesine gidin ve Object URL'yi kopyalayın. Bu URL, dosyanız için genel erişim linkidir.

Bucket Policy ile:

Bucket düzeyinde genel okuma izni verebilirsiniz. Bu, bucket'taki tüm dosyaların veya belirli bir klasördeki dosyaların herkese açık olmasını sağlayabilir. Bir bucket politikası oluşturarak ve bu politikayı S3 bucket'ınıza atayarak bunu yapabilirsiniz. Örnek bir bucket politikası şöyle görünebilir:


json

Copy code

{

    "Version": "2012-10-17",

    "Statement": [{

        "Sid": "PublicReadGetObject",

        "Effect": "Allow",

        "Principal": "*",

        "Action": "s3:GetObject",

        "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*"

    }]

}

IAM Rollerini Kullanarak:

Belirli kullanıcılara veya hizmetlere genel erişim izni verebilirsiniz. Bu, AWS Identity and Access Management (IAM) rolleri ve politikaları kullanılarak yapılabilir. Ancak, bu yöntem genellikle iç kullanım veya belirli entegrasyonlar için tercih edilir ve herkese açık erişim için değil.


Notlar:

Genel erişim linkleri oluştururken, paylaştığınız verilerin hassasiyetini ve herkese açık erişimin olası güvenlik risklerini göz önünde bulundurun.

AWS, S3 bucket'larınızın ve içeriklerinin yanlışlıkla herkese açık hale gelmesini önlemek için çeşitli güvenlik ayarları ve uyarılar sunar. Herkese açık erişim ayarlarınızı dikkatli bir şekilde yönettiğinizden emin olun.


Resim Upload yapan ve s3 kullanan spring boot uygulaması


AWS S3'e resim yükleyen bir Spring Boot uygulaması geliştirmek için birkaç adımı takip etmeniz gerekiyor. Bu süreç, AWS SDK'yı projenize dahil etmek, bir AWS S3 bucket'ı yapılandırmak, bir REST API endpoint'i oluşturmak ve bu endpoint üzerinden yüklenen dosyaları S3'e aktarmak gibi adımlardan oluşur.


Adım 1: Bağımlılıkları Ekleme

pom.xml dosyanıza AWS Java SDK ve Spring Boot starter web bağımlılıklarını ekleyin:


xml

Copy code

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>software.amazon.awssdk</groupId>

        <artifactId>s3</artifactId>

        <version>LATEST_VERSION</version> <!-- AWS SDK S3'nin en son sürümünü kullanın -->

    </dependency>

</dependencies>

Adım 2: Uygulama Özelliklerini Yapılandırma

application.properties veya application.yml dosyasında AWS kimlik bilgilerinizi ve bucket adınızı yapılandırın. Güvenlik nedeniyle, kimlik bilgilerini doğrudan yapılandırma dosyalarında saklamak yerine, AWS IAM rollerini veya Spring'in @Value annotation'ını kullanarak ortam değişkenlerinden okumayı tercih edin.


properties

Copy code

# application.properties

cloud.aws.credentials.accessKey=YOUR_ACCESS_KEY

cloud.aws.credentials.secretKey=YOUR_SECRET_KEY

cloud.aws.region.static=YOUR_REGION

app.s3.bucket=YOUR_BUCKET_NAME

Adım 3: S3 Client Servisini Oluşturma

AWS S3 işlemlerini gerçekleştirecek bir servis sınıfı oluşturun:


java

Copy code

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;

import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;

import software.amazon.awssdk.regions.Region;

import software.amazon.awssdk.services.s3.S3Client;

import software.amazon.awssdk.services.s3.model.PutObjectRequest;

import software.amazon.awssdk.services.s3.model.PutObjectResponse;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Service;

import java.nio.file.Paths;


@Service

public class S3Service {


    private final S3Client s3Client;


    public S3Service(@Value("${cloud.aws.credentials.accessKey}") String accessKey,

                     @Value("${cloud.aws.credentials.secretKey}") String secretKey,

                     @Value("${cloud.aws.region.static}") String region) {

        AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey);

        this.s3Client = S3Client.builder()

                .credentialsProvider(StaticCredentialsProvider.create(awsCreds))

                .region(Region.of(region))

                .build();

    }


    public PutObjectResponse uploadFile(String bucketName, String key, String filePath) {

        return s3Client.putObject(PutObjectRequest.builder()

                        .bucket(bucketName)

                        .key(key)

                        .build(),

                Paths.get(filePath));

    }

}

Adım 4: Dosya Yükleme Controller'ını Oluşturma

Kullanıcılardan alınan dosyaları kabul edecek ve bunları S3'e yükleyecek bir REST controller oluşturun:


java

Copy code

import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;


@RestController

@RequestMapping("/api/upload")

public class FileUploadController {


    private final S3Service s3Service;

    private final String bucketName;


    public FileUploadController(S3Service s3Service, @Value("${app.s3.bucket}") String bucketName) {

        this.s3Service = s3Service;

        this.bucketName = bucketName;

    }


    @PostMapping

    public String uploadFile(@RequestParam("file") MultipartFile file) {

        String key = System.currentTimeMillis() + "_" + file.getOriginalFilename();

        String filePath = "/tmp/" + key; // Geçici olarak kaydetmek için bir yol

        try {

            file.transferTo(Paths.get(filePath));

            s3Service.uploadFile(bucketName, key, filePath);

            return "File uploaded successfully: " + key;

        } catch (Exception e) {

            e.printStackTrace();

            return "File upload failed: " + e.getMessage();

        }

    }

}

Bu örnek, bir dosyayı geçici olarak sunucu kaydeder ve sonra bu dosyayı AWS S3'e yükler. Gerçek uygulamalarda, dosyanın geçici olarak kaydedilmesine gerek olmayabilir ve doğrudan akış işlemleriyle S3'e yüklenebilir.


Adım 5: Uygulamayı Çalıştırma ve Test Etme

Bu adımları tamamladıktan sonra, Spring Boot uygulamanızı çalıştırabilir ve dosya yükleme işlevselliğini test edebilirsiniz. Uygulamanızı çalıştırmak için IDE'nizde sağ tıklayıp Run 'Application' seçeneğini kullanabilir veya terminal/cmd üzerinden aşağıdaki komutu çalıştırabilirsiniz:


arduino

Copy code

./mvnw spring-boot:run

Dosya yükleme işlevselliğini test etmek için Postman veya herhangi bir REST API istemcisi kullanabilirsiniz. localhost:8080/api/upload adresine bir POST isteği gönderin ve form-data olarak bir dosya ekleyin. Başarılı bir yükleme işleminden sonra, yüklenen dosyanın anahtarını içeren bir yanıt almalısınız.


Güvenlik ve İzinler

AWS S3'e dosya yükleme işlemleri sırasında, dosyalarınızın erişim izinlerini dikkatli bir şekilde yönetmeniz önemlidir. Varsayılan olarak, yüklenen dosyalar özel olacaktır. Dosyalarınızın herkese açık olarak erişilebilir olmasını istiyorsanız, PutObjectRequest sırasında uygun erişim izinlerini belirtmeniz gerekecektir. Ayrıca, AWS IAM politikaları ve rolleri kullanarak uygulamanızın AWS kaynaklarına erişimini sıkı bir şekilde kontrol etmeyi unutmayın.


Son Notlar

Uygulamanızın güvenliğini artırmak için, AWS kimlik bilgilerini doğrudan kod içinde veya yapılandırma dosyalarında saklamaktan kaçının. Bunun yerine, AWS IAM rolleri, ortam değişkenleri veya AWS Secrets Manager gibi daha güvenli yöntemleri kullanın.

Dosya yükleme işlemleri sırasında dosya boyutu ve türü gibi kısıtlamaları belirlemeyi düşünün. Bu, uygulamanızın kötüye kullanılmasını önlemeye yardımcı olabilir.

AWS SDK sürüm güncellemeleri ve Spring Boot sürümleri arasındaki uyumluluğu kontrol edin, çünkü bu örnekte kullanılan kod ve bağımlılıklar zamanla değişebilir.

Bu temel örnekle, AWS S3'e dosya yükleme işlevselliği sunan basit bir Spring Boot uygulaması oluşturabilir ve uygulamanızın gereksinimlerine göre bu örneği genişletebilirsiniz.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال