登录
首页 >  Golang >  Go问答

使用 golang 和 lambda 从 s3 读取文件时出现问题

来源:stackoverflow

时间:2024-04-25 22:18:38 244浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《使用 golang 和 lambda 从 s3 读取文件时出现问题》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我在 golang 中有以下代码,用于读取文件并提取文件的一些列,文件名是从我的 lambda 接收的,但在我的第一步中,即从 s3 获取文件,我遇到了问题。 p>

我的代码是:

package main

import (
    "fmt"
    "packagexxx/cmd/utils"

    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
    "go.uber.org/zap"
)

var (
    log *zap.logger
)

func init() {
    log = utils.initlogger()
}

func downloadfile(downloader *s3manager.downloader, bucketname string, key string) error {

    buff := &aws.writeatbuffer{}

    numbytes, err := downloader.download(
        buff,
        &s3.getobjectinput{
            bucket: aws.string(bucketname),
            key:    aws.string(key),
        },
    )

    data := buff.bytes() // now data is my []byte array

    log.info("nnnnnnnnnnnnnnn", zap.any("nnn", numbytes))
    log.info("xxxxxxxxxxxxxxx", zap.any("bytes", data))
    return err
}

func handler(filename string) (string, error) {
    log.info(fmt.sprintf("received: %s", filename))
    sess, err := session.newsessionwithoptions(session.options{
        profile: "default",
        config: aws.config{
            region: aws.string("us-west-2"),
        },
    })

    if err != nil {
        log.info("errorrrrrrrrr", zap.any("session", err))
        return "errorr,", nil
    } else {
        log.info("sessionnnnnnnnnnnnnn", zap.any("sess", sess))
    }

    bucketname := "s3-test-lambda-go-xxx"
    downloader := s3manager.newdownloader(sess)
    log.info("downloader", zap.any("downloader", err))
    key := filename
    err = downloadfile(downloader, bucketname, key)

    if err != nil {
        fmt.printf("couldn't download file: %v", err)
        return "errror", nil
    }

    fmt.println("successfully downloaded file")

    return fmt.sprintf("el file recibido es: %s", filename), nil
}

func main() {
    lambda.start(handler)
}

正在打印的日志是:

For verbose messaging see aws.Config.CredentialsChainVerboseErrorsSTART RequestId: dba8ebd5-9102-4a2f-8e45-cdef355f1bbd Version: $LATEST
{"level":"info","ts":"2022-11-02T17:31:32Z","msg":"received: gggggg2.txt"}
{"level":"info","ts":"2022-11-02T17:31:32Z","msg":"sessionnnnnnnnnnnnnn","sessError":"json: unsupported type: endpoints.endpointDefaults"}
{"level":"info","ts":"2022-11-02T17:31:32Z","msg":"downloader","downloader":null}
{"level":"info","ts":"2022-11-02T17:31:38Z","msg":"nnnnnnnnnnnnnnn","nnn":0}
{"level":"info","ts":"2022-11-02T17:31:38Z","msg":"xxxxxxxxxxxxxxx","bytes":""}
Couldn't download file: NoCredentialProviders: no valid providers in chain. Deprecated.
END RequestId: dba8ebd5-9102-4a2f-8e45-cdef355f1bbd

问题是会话

那么是否可以创建具有角色的会话,因为就像生产一样,我不想使用访问权限和密钥? 非常感谢


正确答案


如果您像这样,会话将加载您的默认会话

sess, err := session.newsession(&aws.config{
  region: aws.string("us-east-1")},
)

而不是:

    sess, err := session.NewSessionWithOptions(session.Options{
        Profile: "default",
        Config: aws.Config{
            Region: aws.String("us-west-2"),
        },
    })

这意味着它将使用您配置的任何会话,而不取决于您是在 lambda 还是本地。这也意味着您可以担任您想要担任的任何角色,甚至可以使用 sso 登录(因此不需要访问密钥和机密)。

今天关于《使用 golang 和 lambda 从 s3 读取文件时出现问题》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>