2016-07-25 14 views
6

erişim engellendi. Ben AWS konsolunu kullanarak bilgisayarımdan kovaya bir JPEG dosyası yükledi - şimdi benim Bahar Boot API kullanarak bu dosyayı indirmeye çalışıyorum. Bir kullanıcı ve AWS konsolda bir grup (kullanıcı gruptadır) yarattık com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied;Bahar Boot Amazon AWS S3 Kepçe Dosya İndirme - Bir otomatik olarak yapılandırılır AWS, Bahar Boot uygulaması var ve kurulum için sadece Amazon S3 belirli bir kova belirli dosya indirir bir bitiş noktası çalışıyorum

;:

aşağıdaki hatayı alıyorum kullanıcı/grup S3'te yönetici erişiminin yanı sıra tam erişim izinlerine sahiptir. Ben test amaçlı, erişim anahtar/gizli anahtar çifti indirip, kelimenin tam anlamıyla (:) Açıkçası, tuşlar burada gösterilmemiştir) aşağıda gösterildiği gibi benim application.properties dosyasına anahtarlarını yapıştırılan.

ben neden hala erişim engellendi alıyorum olarak karıştı. Bir süredir araştırıyor ve üzerinde çalışıyorum; Bu soruna Spring Boot'a özgü bir çözüm bulamıyorum. Herhangi bir yardım büyük takdir edilecektir.

application.properties:

cloud.aws.credentials.accessKey=myaccesskey 
cloud.aws.credentials.secretKey=mysecretkey 
cloud.aws.credentials.instanceProfile=false 
cloud.aws.stack.auto=false 

cloud.aws.region.auto=true 
cloud.aws.region.static=myregion 

SimpleResourceLoadingBean.java:

@RestController 
public class SimpleResourceLoadingBean { 

    private static Logger log = LoggerFactory.getLogger(HealthMonitorApplication.class); 

    @Autowired 
    private ResourceLoader resourceLoader; 


    @RequestMapping("/getresource") 
    public String resourceLoadingMethod() throws IOException { 
     log.info("IN RESOURCE LOADER"); 

     Resource resource = this.resourceLoader.getResource("s3://s3.amazonaws.com/mybucket/myfile.ext"); 

     InputStream inputStream = resource.getInputStream(); 

     return inputStream.toString(); 
    } 
} 

pom.xml (sorusuna alakalı Sadece bağımlılıkları)

 <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-aws</artifactId> 
      <version>1.1.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-aws-autoconfigure</artifactId> 
      <version>1.1.0.RELEASE</version> 
     </dependency> 
+0

cloud.aws.credentials.instanceProfile = false değerini değiştirin ve çalışıp çalışmadığını kontrol edin. – error2007s

+0

Denenmiş ve başarısız: 1 – corecase

+0

Yukarıdaki Bahar uygulaması yerel mi, yoksa EC2 örneğinde mi? – error2007s

cevap

13

çözdü çözüm. application.properties yapılandırma Ayrıca, ben uygun kimlik sağlandığında bir AmazonS3Client nesneye bana erişimi verecek bir yapılandırma sınıfı oluşturmak zorunda kaldı. Ben GitHub'dan bu örneği takip:

https://github.com/brant-hwang/spring-cloud-aws-example/blob/master/src/main/java/com/axisj/spring/cloud/aws/AWSConfiguration.java

AWSConfiguration.java: Bu yapılandırıldığında sonra, diğer sınıflarda AmazonS3Client nesneleri (autowired) oluşturun ve müşteri kullanabilirsiniz

import com.amazonaws.auth.AWSCredentials; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 
import com.amazonaws.services.s3.AmazonS3Client; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class AWSConfiguration { 

    @Value("${cloud.aws.credentials.accessKey}") 
    private String accessKey; 

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

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

    @Bean 
    public BasicAWSCredentials basicAWSCredentials() { 
     return new BasicAWSCredentials(accessKey, secretKey); 
    } 

    @Bean 
    public AmazonS3Client amazonS3Client(AWSCredentials awsCredentials) { 
     AmazonS3Client amazonS3Client = new AmazonS3Client(awsCredentials); 
     amazonS3Client.setRegion(Region.getRegion(Regions.fromName(region))); 
     return amazonS3Client; 
    } 
} 

S3 bulutunuza istekte bulunun. Örnek ek kontrol sınıfları uygulanmasını kolaylaştırmak amacıyla bir hizmet olarak bir sargı sınıfı kullanır.

S3Wrapper.java:

import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.services.s3.model.*; 
import org.apache.commons.io.IOUtils; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.MediaType; 
import org.springframework.http.ResponseEntity; 
import org.springframework.stereotype.Service; 
import org.springframework.util.StringUtils; 
import org.springframework.web.multipart.MultipartFile; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URLEncoder; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

@Service 
public class S3Wrapper { 

    @Autowired 
    private AmazonS3Client amazonS3Client; 

    @Value("${cloud.aws.s3.bucket}") 
    private String bucket; 

    private PutObjectResult upload(String filePath, String uploadKey) throws FileNotFoundException { 
     return upload(new FileInputStream(filePath), uploadKey); 
    } 

    private PutObjectResult upload(InputStream inputStream, String uploadKey) { 
     PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, uploadKey, inputStream, new ObjectMetadata()); 

     putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead); 

     PutObjectResult putObjectResult = amazonS3Client.putObject(putObjectRequest); 

     IOUtils.closeQuietly(inputStream); 

     return putObjectResult; 
    } 

    public List<PutObjectResult> upload(MultipartFile[] multipartFiles) { 
     List<PutObjectResult> putObjectResults = new ArrayList<>(); 

     Arrays.stream(multipartFiles) 
       .filter(multipartFile -> !StringUtils.isEmpty(multipartFile.getOriginalFilename())) 
       .forEach(multipartFile -> { 
        try { 
         putObjectResults.add(upload(multipartFile.getInputStream(), multipartFile.getOriginalFilename())); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       }); 

     return putObjectResults; 
    } 

    public ResponseEntity<byte[]> download(String key) throws IOException { 
     GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, key); 

     S3Object s3Object = amazonS3Client.getObject(getObjectRequest); 

     S3ObjectInputStream objectInputStream = s3Object.getObjectContent(); 

     byte[] bytes = IOUtils.toByteArray(objectInputStream); 

     String fileName = URLEncoder.encode(key, "UTF-8").replaceAll("\\+", "%20"); 

     HttpHeaders httpHeaders = new HttpHeaders(); 
     httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
     httpHeaders.setContentLength(bytes.length); 
     httpHeaders.setContentDispositionFormData("attachment", fileName); 

     return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK); 
    } 

    public List<S3ObjectSummary> list() { 
     ObjectListing objectListing = amazonS3Client.listObjects(new ListObjectsRequest().withBucketName(bucket)); 

     List<S3ObjectSummary> s3ObjectSummaries = objectListing.getObjectSummaries(); 

     return s3ObjectSummaries; 
    } 
} 

Not: Aşağıdaki bağımlılık Apache Commons GÇ kütüphanesini kullanmak için pom.xml ilave edilmesi gerekecektir.

pom.xml:

<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>1.3.2</version> 
</dependency> 
+0

Ancak ilkbahar-önyükleme, Yapılandırma sınıflarınızdan birine EnableAutoConfiguration ek açıklamaları ekleyerek otomatik yapılandırma sağlar. aws yapılandırılmıyor. – M05

2

kabul cevap kaldırılmış API'ları kullanıyor. İşte güncellenmiş bir revizyon.

Öncelikle güncellemeniz maven bağımlılıkları:

<dependency> 
     <groupId>com.amazonaws</groupId> 
     <artifactId>aws-java-sdk</artifactId> 
     <version>1.11.274</version> 
    </dependency> 

AWSConfiguration.java

import com.amazonaws.auth.AWSCredentials; 
import com.amazonaws.auth.AWSStaticCredentialsProvider; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3ClientBuilder; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class AWSConfiguration { 

    @Value("${cloud.aws.credentials.accessKey}") 
    private String accessKey; 

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

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

    @Bean 
    public BasicAWSCredentials basicAWSCredentials() { 
     return new BasicAWSCredentials(accessKey, secretKey); 
    } 

    @Bean 
    public AmazonS3 amazonS3Client(AWSCredentials awsCredentials) { 
     AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard(); 
     builder.withCredentials(new AWSStaticCredentialsProvider(awsCredentials)); 
     builder.setRegion(region); 
     AmazonS3 amazonS3 = builder.build(); 
     return amazonS3; 
    } 
} 

S3Service.java

import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.services.s3.model.*; 
import org.apache.commons.io.IOUtils; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.MediaType; 
import org.springframework.http.ResponseEntity; 
import org.springframework.stereotype.Service; 
import org.springframework.util.StringUtils; 
import org.springframework.web.multipart.MultipartFile; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URLEncoder; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

@Service 
public class S3Service { 

    @Autowired 
    private AmazonS3 amazonS3; 

    @Value("${cloud.aws.s3.bucket}") 
    private String bucket; 

    private PutObjectResult upload(String filePath, String uploadKey) throws FileNotFoundException { 
     return upload(new FileInputStream(filePath), uploadKey); 
    } 

    private PutObjectResult upload(InputStream inputStream, String uploadKey) { 
     PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, uploadKey, inputStream, new ObjectMetadata()); 

     putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead); 

     PutObjectResult putObjectResult = amazonS3.putObject(putObjectRequest); 

     IOUtils.closeQuietly(inputStream); 

     return putObjectResult; 
    } 

    public List<PutObjectResult> upload(MultipartFile[] multipartFiles) { 
     List<PutObjectResult> putObjectResults = new ArrayList<>(); 

     Arrays.stream(multipartFiles) 
       .filter(multipartFile -> !StringUtils.isEmpty(multipartFile.getOriginalFilename())) 
       .forEach(multipartFile -> { 
        try { 
         putObjectResults.add(upload(multipartFile.getInputStream(), multipartFile.getOriginalFilename())); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       }); 

     return putObjectResults; 
    } 

    public ResponseEntity<byte[]> download(String key) throws IOException { 
     GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, key); 

     S3Object s3Object = amazonS3.getObject(getObjectRequest); 

     S3ObjectInputStream objectInputStream = s3Object.getObjectContent(); 

     byte[] bytes = IOUtils.toByteArray(objectInputStream); 

     String fileName = URLEncoder.encode(key, "UTF-8").replaceAll("\\+", "%20"); 

     HttpHeaders httpHeaders = new HttpHeaders(); 
     httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
     httpHeaders.setContentLength(bytes.length); 
     httpHeaders.setContentDispositionFormData("attachment", fileName); 

     return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK); 
    } 

    public List<S3ObjectSummary> list() { 
     ObjectListing objectListing = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucket)); 

     List<S3ObjectSummary> s3ObjectSummaries = objectListing.getObjectSummaries(); 

     return s3ObjectSummaries; 
    } 
}