如何读取 main.go 之外的文件并使其在 AWS lambda 上运行
How to read files outside main.go, and make it work on AWS lambda
在 AWS Lambda 上,我想在外部使用 CSV 文件 main.go
当我按照这些步骤操作时,这当然有效。
- cd ~/go/src/lambda-go-sample
- GOOS=linux 去建造 main.go
- zip main.zip 主
- 上传到 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”实际上为它的进程提供的运行时间环境运行。
如果我是你,我会开始这个位。
在 AWS Lambda 上,我想在外部使用 CSV 文件 main.go
当我按照这些步骤操作时,这当然有效。
- cd ~/go/src/lambda-go-sample
- GOOS=linux 去建造 main.go
- zip main.zip 主
- 上传到 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”实际上为它的进程提供的运行时间环境运行。
如果我是你,我会开始这个位。