Asynchronous F#AWS lambda-异步函数的某些部分永远不会执行

Asynchronous F#AWS lambda-异步函数的某些部分永远不会执行,asynchronous,aws-lambda,f#,f#-data,Asynchronous,Aws Lambda,F#,F# Data,我在AWS Lambda中有一个异步F#函数。但是,在测试它时,函数的某些部分永远不会被调用。该函数始终在10秒后终止,即使aws lambda tools defaults.json文件将超时指定为30秒 代码如下: namespace MyProject open FSharp.Data type SecretsJson = JsonProvider<"./Resources/Secrets.json", RootName="Secret"&

我在AWS Lambda中有一个异步F#函数。但是,在测试它时,函数的某些部分永远不会被调用。该函数始终在10秒后终止,即使
aws lambda tools defaults.json
文件将超时指定为30秒

代码如下:

namespace MyProject

open FSharp.Data

type SecretsJson = JsonProvider<"./Resources/Secrets.json", RootName="Secret">

module ApiClient = 
    let testGet (secrets: SecretsJson.Secret) =
        async {      
            printfn "%s" "3. This is sometimes printed out and sometimes not."
            
            let! test = Http.AsyncRequestString("https://postman-echo.com/get?foo1=bar1&foo2=bar2")
            printfn "%s" "4. This is never printed."
            return ""
        }
名称空间MyProject
打开FSharp.Data
类型SecretsJson=JsonProvider
模块ApiClient=
让testGet(秘密:SecretsJson.Secret)=
异步{
printfn“%s”3。有时打印出来,有时不打印出来
let!test=Http.AsyncRequestString(“https://postman-echo.com/get?foo1=bar1&foo2=bar2")
printfn“%s”4。从未打印此内容
返回“”
}
名称空间MyProject
打开Amazon.Lambda.Core
开放亚马逊
打开Amazon.S3
打开Amazon.S3.Util
开放系统
打开Amazon.S3.Model
打开Amazon.SecretsManager.Extensions.Caching
[]
()
类型函数()=
成员函数处理程序(输入:S3EventNotification)(ILambdaContext):System.Threading.Tasks.Task=
printfn“%s”1。始终打印此内容
异步{
使用客户端=新AmazonS3Client(RegionEndpoint.EUWest1)
使用secretsCache=newsecretsmanagercache()
let!secretsString=secretsCache.GetSecretString“secretsKey”|>Async.AwaitTask
printfn“%s”2。并且始终打印此内容
let secrets=SecretsJson.Parse(secretsString)
let!response=ApiClient.testGet secrets
printfn“%s”5。从未打印过此内容
}|>Async.startask

我不理解这种行为。我认为
|>Async.startask
表达式将确保
函数.FunctionHandler
中的整个
Async
块作为标准的C任务执行。或者我必须转换我的
Async中的每一个,异步代码不应该是问题的根源。我尝试了以下方法:

open System
open Amazon.Lambda.Core

open FSharp.Data

let loadStuff (context: ILambdaContext) (i:int) =
        async {        

            let! test = Http.AsyncRequestString("https://www.google.com")

            sprintf "i:%i Length: %i" i test.Length
            |> context.Logger.LogLine

        } 

这需要12秒,并输出:

i:6 Length: 47974
i:3 Length: 47201
i:4 Length: 47200
i:8 Length: 47255
i:5 Length: 47183
i:1 Length: 47145
i:7 Length: 47203
i:9 Length: 47177
i:10 Length: 47202
i:2 Length: 47198
i:14 Length: 47201
i:12 Length: 47155
i:11 Length: 47250
i:13 Length: 47162
i:15 Length: 47130

考虑向代码中添加try-catch块,并使用context.Logger.Logline代替printfn。此外,如果您有很长时间的工作,例如>30秒。考虑把它们分解成更多的函数,并可能与类似的东西进行协调。

你检查了AWS日志吗?有什么要报告的吗?还有文件说“AWS Lambda不支持异步void方法。”你能试着返回一些值吗?你是对的,我一直忽略了一个地形文件。该文件不断重写lambda设置,以在10秒后终止。无论如何,谢谢你的努力-我很惊讶你提出了一个完整的AWS lambda函数只是为了测试相同的情况。@Storm我真的很好奇。我以前使用过Azure函数,所以不知道AWS中是否存在任何漏洞。
type Functions() =

member __.Get (request: APIGatewayProxyRequest) (context: ILambdaContext) =

    async {        

            do! [1..10]
                |>Seq.map (Loader.loadStuff context)
                |>Async.Parallel
                |>Async.Ignore

            do! Async.Sleep(10000)

            do! [11..15]
                |>Seq.map (Loader.loadStuff context)
                |>Async.Parallel
                |>Async.Ignore


    } 
    |> Async.StartAsTask
i:6 Length: 47974
i:3 Length: 47201
i:4 Length: 47200
i:8 Length: 47255
i:5 Length: 47183
i:1 Length: 47145
i:7 Length: 47203
i:9 Length: 47177
i:10 Length: 47202
i:2 Length: 47198
i:14 Length: 47201
i:12 Length: 47155
i:11 Length: 47250
i:13 Length: 47162
i:15 Length: 47130