我在OpenWhisk(IBM Cloud Functions)上运行golang包时遇到了一些麻烦。
我在本地计算机上运行了以下内容,它没有任何问题("PermissionInvokeLambdaRule": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName": { "Fn::GetAtt": ["MyLambdaResouce", "Arn"] },
"Action": "lambda:InvokeFunction",
"Principal": "events.amazonaws.com",
"SourceArn": { "Fn::GetAtt": ["MyEventsRuleResource", "Arn"] }
}
},
):
<NoWarn>1591</NoWarn>
但我没有找到任何方法让它在OpenWhisk上工作。我运行了以下内容:
go run sample.go
“错误”:“该操作未返回字典。”
“2018-02-21T01:21:05.962244788Z stdout:[Errno 2]没有这样的文件或 目录:'/ action / exec'“
问题与package main
import (
"fmt"
"encoding/json"
"github.com/go-redis/redis"
)
func main() {
var redisClient *redis.Client = redis.NewClient(&redis.Options{
Addr: "...",
Password: "...",
DB: 0,
})
redisClient.Set("foo", "bar", 0)
defer redisClient.Close()
msg := map[string]string{"msg": ("Done !")}
res, _ := json.Marshal(msg)
fmt.Println(string(res))
}
包有关,当我删除它及其代码时,该函数运行良好。我遇到了GOOS=linux GOARCH=amd64 go build -o exec sample.go
zip exec.zip exec
bx wsk action update myfunction --native exec.zip
bx wsk action invoke myfunction -r
bx wsk activation logs --last --strip
包(MongoDB)...
我是Golang的新手所以很明显,但是现在我被卡住了:/
答案 0 :(得分:3)
zip文件中的二进制文件动态链接到平台上不可用的共享库。
使用file
和ldd
确认了这一点:
$ file exec
exec: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
$ ldd exec
/lib64/ld-linux-x86-64.so.2 (0x7f3f63f10000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f3f63f10000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f3f63f10000)
在平台(openwhisk/dockerskeleton
)使用的Docker镜像中构建静态二进制文件或构建动态链接二进制文件。
在执行此问题的文件时,file not found
错误会产生误导,但会reported by bash。
答案 1 :(得分:-1)
“错误”:“该操作未返回字典。”
这是一个打开的wsk错误消息。 这意味着您没有在stdout上返回字典
下面的是返回json对象的有效返回值
{“错误”:“东西坏了!”}
以下将无效
“有些东西坏了!”
建议:检查构建时是否有任何错误(通常) 你的Dropbox中的文件看起来不像二进制文件...我建议你检查一下你可以先构建二进制文件