如何读取 main.go 之外的文件并使其在 AWS lambda 上运行

How to read files outside main.go, and make it work on AWS lambda

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

当我按照这些步骤操作时,这当然有效。

  1. cd ~/go/src/lambda-go-sample
  2. GOOS=linux 去建造 main.go
  3. zip main.zip 主
  4. 上传到 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)
}

现在我在main.go的同一目录下添加sample.csv,并添加代码读取它。

lambda-go-样本

|- main.go

|- sample.csv

main.go

...

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”有没有这个概念,但是当一个过程在当代商品中起作用时OS它有"current directory" or "working directory" or "current working directory"的概念;任何使用相对(非绝对)名称访问文件的尝试都会将该名称解释为相对于当前进程的 CWD。

请注意另外两件事:

  • 启动进程时,OS 可以自由地将其 CWD 设置为它想要的任何值。
    当您 运行 交互式 shell 中的进程时,shell 将进程的 CWD 设置为 shell 的当前目录,这可能不会立即显而易见,并且 OS 本身不会干扰。
  • 该进程可以在 运行 时间更改其 CWD。

请注意一件事:“lambda”实际上可能有一个与 CWD 相似但正交的概念:例如,它可能需要进程查询某些环境变量(或其他信息资源)以了解它的位置“资产”被放置。

所以,退一步吧。您可以从 os.Getwd to get the process' CWD and then use path/filepath.Join 开始获取 CSV 文件的全名,然后尝试读取它。

如果失败了,您可能想要更深入地了解“lambda”实际上为它的进程提供的运行时间环境运行。
如果我是你,我会开始这个位。