前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s中通过aws sdk访问s3遇到的坑

k8s中通过aws sdk访问s3遇到的坑

作者头像
一笠风雨任生平
发布2022-01-06 14:17:27
1.9K0
发布2022-01-06 14:17:27
举报
文章被收录于专栏:服务化进程服务化进程

背景

公司有一套基于k8s的paas系统,现在pod中安装了aws 命令行工具

代码语言:javascript
复制
RUN apk add py-pip && pip install awscli

可以使用命令直接get、put文件,如下:

在这里插入图片描述
在这里插入图片描述

由于java使用命令行时可能会出现卡死现象,所以这里想使用aws提供的sdk来直接上传下载文件。 默认有两种方式,一种是程序中配置key:

代码语言:javascript
复制
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, awsSecretKey);
            s3 = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCredentials)).withRegion(Regions.DEFAULT_REGION).build();

另外一种如下:

代码语言:javascript
复制
s3 = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.DEFAULT_REGION).build();

报错

报错一:java.lang.IllegalArgumentException: profile file cannot be null

原因:这里是没找到配置文件,~/.aws/credentials 解决方案: 在dorker中需要直接使用下面方式来初始化s3client

代码语言:javascript
复制
AmazonS3 s3Client = new AmazonS3Client();
或者
AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance());

最终初始化代码如下:

代码语言:javascript
复制
s3 = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).withRegion(Regions.DEFAULT_REGION).build();

参考链接: https://stackoverflow.com/questions/41796355/aws-error-downloading-object-from-s3-profile-file-cannot-be-null

报错二:Amazon S3 exception: “The specified key does not exist”

详细报错:

代码语言:javascript
复制
com.amazonaws.services.s3.model.AmazonS3Exception: 
The specified key does not exist.
 (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey;

代码如下:

代码语言:javascript
复制
 public static void downloadFile(String fileName,String savePath) {
        S3Object s3Object = s3.getObject(bucketName, fileName);
        FileOutputStream fos = null;
        try (S3ObjectInputStream s3input = s3Object.getObjectContent()){
            fos = new FileOutputStream(new File(savePath));
            byte[] read_buf = new byte[1024];
            int read_len = 0;
            while ((read_len = s3input.read(read_buf)) > 0) {
                fos.write(read_buf, 0, read_len);
            }
            s3Object.close();
            fos.close();
        } catch (Exception e) {
            log.warn("获取文件异常:fileName={},savePath={}",fileName,savePath,e);
            throw new AppException("获取文件异常:fileName="+fileName+",savePath="+savePath);
        } finally {
            try{
                if(fos!=null) {
                    fos.close();
                }
            }catch (IOException e){
                log.warn("关闭文件流异常:fileName={},savePath={}",fileName,savePath,e);
            }
        }
    }

原因:这里是只找不到文件 解决方案:检查s3上的文件路径是否正确, 举个例子:s3://bucket_name/aa/bb/mm.csv 这里的fileName参数应该传“aa/bb/mm.csv”;

报错三:/data/xx/xx/aa.csv not exists

这个原因比较明显,是目标文件找不到,请先确认号父目录是否创建

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020/06/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 报错
    • 报错一:java.lang.IllegalArgumentException: profile file cannot be null
      • 报错二:Amazon S3 exception: “The specified key does not exist”
        • 报错三:/data/xx/xx/aa.csv not exists
        相关产品与服务
        命令行工具
        腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档