使用 LocalStack pro 0.14.3,我创建了一个简单的 Lambda 函数,它接受一个字符串输入并返回一个字符串。我使用下面的代码在 localstack 中创建了一个函数。
awslocal lambda create-function `
--function-name "simple-lambda1" `
--zip-file fileb://C:\SimpleLambda\SimpleLambda\SimpleLambda1.zip `
--handler SimpleLambda::SimpleLambda.Function::FunctionHandler `
--runtime dotnetcore3.1 `
--role arn:aws:iam::000000000000:role/lambda-dotnet-ex
这是我的单元测试。
[Test]
public void Lambda_Function_Call_Succeeds()
{
var _lambdaClient = new AmazonLambdaClient(new BasicAWSCredentials("temp", "temp"), new AmazonLambdaConfig()
{
ServiceURL = "http://localhost:4566"
});
var input = "test";
var lambdaInvokeRequest = new InvokeRequest
{
FunctionName = "simple-lambda1",
InvocationType = InvocationType.RequestResponse,
Payload = JsonConvert.SerializeObject(input),
};
var lambdaInvocationResponse = _lambdaClient.Invoke(lambdaInvokeRequest);
var js = new JsonSerializer();
var result = js.Deserialize<string>(lambdaInvocationResponse.Payload);
Assert.AreEqual("WELCOME TEST", result);
}
以上工作正常,但是当我在创建函数时将区域指定为 eu-west-1 然后尝试相同的单元测试时,我得到以下正确的异常。
Amazon.Lambda.Model.ResourceNotFoundException: 'Function not found: arn:aws:lambda:us-east-1:000000000000:function:simple-lambda1'
我尝试将区域添加到 lambdaclient。
[Test]
public void Lambda_Function_Call_Succeeds()
{
var _lambdaClient = new AmazonLambdaClient(new BasicAWSCredentials("temp", "temp"), new AmazonLambdaConfig()
{
ServiceURL = "http://localhost:4566", RegionEndpoint = RegionEndpoint.EUWest1
});
var input = "test";
var lambdaInvokeRequest = new InvokeRequest
{
FunctionName = "simple-lambda1",
InvocationType = InvocationType.RequestResponse,
Payload = JsonConvert.SerializeObject(input),
};
var lambdaInvocationResponse = _lambdaClient.Invoke(lambdaInvokeRequest);
var js = new JsonSerializer();
var result = js.Deserialize<string>(lambdaInvocationResponse.Payload);
Assert.AreEqual("WELCOME TEST", result);
}
但上面的代码给了我一个 Amazon.Lambda.AmazonLambdaException:“请求中包含的安全 token 无效。” WebException:远程服务器返回错误:(403)禁止访问。有什么明显的地方我做错了吗?
这是我的 docker compose 文件
version: "3.8"
services:
localstack:
image: localstack/localstack:latest
container_name: localstack_test
privileged: true
ports:
- 53:53
- 4510-4599:4510-4599
- 8000:8080
environment:
- LOCALSTACK_API_KEY=XXX
- SERVICES=s3,sqs,dynamodb,lambda,cloudformation,ssm,iam,cloudwatch,sts,kinesis,events,xray,ecr
- DATA_DIR=/tmp/localstack/data
- LEGACY_PERSISTENCE=false
- EDGE_PORT=4566
- PORT_WEB_UI=8081
- START_WEB=1
- DEBUG=1
- LAMBDA_EXECUTOR=local
- HOSTNAME_EXTERNAL=localhost
- LOCALSTACK_HOSTNAME=localhost
- REQUIRE_PRO=0
volumes:
- c:/localstack:/tmp/localstack
- '/var/run/docker.sock:/var/run/docker.sock'
networks:
- localstack-ent
networks:
localstack-ent:
external: false
driver: bridge
最佳答案
在 docker compose 文件中使用以下内容,为我解决了问题
- USE_SINGLE_REGION=1
- DEFAULT_REGION=eu-west-1
关于amazon-web-services - 使用 AmazonLambdaClient 时,Localstack 无法在 us-east-1 以外的任何区域内找到 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72355481/