Amazon web services 如何读取main.go之外的文件,并使其在AWS lambda上工作

Amazon web services 如何读取main.go之外的文件,并使其在AWS lambda上工作,amazon-web-services,go,file-io,aws-lambda,Amazon Web Services,Go,File Io,Aws Lambda,在AWS Lambda上,我想在main.go之外使用CSV文件 当然,当我遵循这些步骤时,这会起作用 cd~/go/src/lambda go样本 GOOS=linux go build main.go zip main.zip main 上传到Lambda并测试=>“你好!” main.go package main import ( "github.com/aws/aws-lambda-go/lambda" ) func hello() (string, e

在AWS Lambda上,我想在main.go之外使用CSV文件

当然,当我遵循这些步骤时,这会起作用

  • cd~/go/src/lambda go样本
  • GOOS=linux go build main.go
  • zip main.zip main
  • 上传到Lambda并测试=>“你好!”
  • main.go

    package main
    
    import (
        "github.com/aws/aws-lambda-go/lambda"
    )
    
    func hello() (string, error) {
        return "Hello ƛ!", nil
    }
    
    func main() {
        lambda.Start(hello)
    }
    
    
    ...
    
    func hello()([]string ,error){
       queries, err := readCSV("sample.csv")
       return queries, err
    }
    
    func main(){
       lambda.Start(hello)
    }
    
    func readCSV(fileName string) (queries []string, err error) {
        f, err := os.Open(fileName)
        if err != nil {
            fmt.Fprintln(os.Stderr, "Failed to read CSV file", err)
            return nil, err
        }
    
        r := csv.NewReader(f)
        for {
            record, err := r.Read()
            if err == io.EOF {
                break
            }
            if err != nil {
                fmt.Fprintln(os.Stderr, "Failed to read CSV record", err)
                return nil, err
            }
    
            companyName := strings.Replace(record[1], "INC", "", -1)
            queries = append(queries, companyName+"CM")
        }
        return queries, nil
    }
    
    现在,我将sample.csv添加到main.go的同一目录中,并添加代码来读取它

    lambda go样品

    |-主要操作

    |-sample.csv

    main.go

    package main
    
    import (
        "github.com/aws/aws-lambda-go/lambda"
    )
    
    func hello() (string, error) {
        return "Hello ƛ!", nil
    }
    
    func main() {
        lambda.Start(hello)
    }
    
    
    ...
    
    func hello()([]string ,error){
       queries, err := readCSV("sample.csv")
       return queries, err
    }
    
    func main(){
       lambda.Start(hello)
    }
    
    func readCSV(fileName string) (queries []string, err error) {
        f, err := os.Open(fileName)
        if err != nil {
            fmt.Fprintln(os.Stderr, "Failed to read CSV file", err)
            return nil, err
        }
    
        r := csv.NewReader(f)
        for {
            record, err := r.Read()
            if err == io.EOF {
                break
            }
            if err != nil {
                fmt.Fprintln(os.Stderr, "Failed to read CSV record", err)
                return nil, err
            }
    
            companyName := strings.Replace(record[1], "INC", "", -1)
            queries = append(queries, companyName+"CM")
        }
        return queries, nil
    }
    
    然后,当我按照上面相同的步骤操作时,这个错误发生在控制台上

    {
      "errorMessage": "open sample: no such file or directory",
      "errorType": "PathError"
    }
    

    我怎样才能解决这个问题呢?

    我不知道“lambda”这个东西是否有这个概念,但当一个过程在当代商品操作系统中工作时,它有一个概念;任何使用相对(而非绝对)名称访问文件的尝试都会将该名称解释为相对于当前进程的CWD

    注意另外两件事:

    • 启动进程时,操作系统可以自由地将其CWD设置为它想要的任何值。
      当您在交互式shell中运行进程时,shell会将进程的CWD设置为shell当前的目录,并且操作系统本身不会干扰,这一点可能并不明显
    • 进程可以在运行时更改其CWD
    请注意,还有一件事:“lambda”实际上可能有一个与CWD相似但正交的概念:例如,它可能需要流程查询某个环境变量(或其他信息资源)以了解其“资产”的位置

    所以,退一步。您可以从获取进程的CWD开始,然后使用获取CSV文件的全名,然后尝试读取它

    如果失败了,您可能需要深入了解“lambda”东西实际为其运行的进程提供的运行时环境。

    如果我是你,我会从这一点开始。

    我不知道“lambda”的东西是否有这个概念,但当一个过程在当代商品操作系统中工作时,它有一个概念;任何使用相对(而非绝对)名称访问文件的尝试都会将该名称解释为相对于当前进程的CWD

    注意另外两件事:

    • 启动进程时,操作系统可以自由地将其CWD设置为它想要的任何值。
      当您在交互式shell中运行进程时,shell会将进程的CWD设置为shell当前的目录,并且操作系统本身不会干扰,这一点可能并不明显
    • 进程可以在运行时更改其CWD
    请注意,还有一件事:“lambda”实际上可能有一个与CWD相似但正交的概念:例如,它可能需要流程查询某个环境变量(或其他信息资源)以了解其“资产”的位置

    所以,退一步。您可以从获取进程的CWD开始,然后使用获取CSV文件的全名,然后尝试读取它

    如果失败了,您可能需要深入了解“lambda”东西实际为其运行的进程提供的运行时环境。

    如果我是你,我会从这一点开始。

    转到buildmain.go
    是错误的(即使它可能工作)!!使用
    go
    工具时,切勿使用文件名。不要提供参数(例如普通的
    go-build
    )或使用包导入路径(或文件系统路径)作为参数。
    go-build-main.go
    是错误的(即使它可能工作)!!使用
    go
    工具时,切勿使用文件名。不要提供参数(例如普通的
    go-build
    )或使用包导入路径(或文件系统路径)作为参数。