首页 > 解决方案 > LocalStackContainer 集成测试 lambda

问题描述

有没有一种方法可以(集成)使用 testcontainers 和以下 LocalStackContainer 为 AWS 测试 Lambda:

new LocalStackContainer(DockerImageName.parse('localstack/localstack:0.11.6'))
    .withServices(LocalStackContainer.Service.LAMBDA)

具体来说,我如何将 Lambda“上传”到本地运行的服务,以便我可以触发和测试它?

标签: javaaws-lambdaspocktestcontainerslocalstack

解决方案


一旦LocalStackContainer启动,您可以在容器内执行命令来设置您的基础设施。LocalStack 提供awslocal二进制文件来创建任何 AWS 资源。

在您的测试中,您可以有一个@BeforeAll步骤来使用您的容器引用并创建所有内容。

以下示例针对 S3 和 SQS 执行此操作(来自此博客文章的参考):

@Testcontainers
@SpringBootTest
public class YourLocalStackIT {
 
  @Container
  static LocalStackContainer localStack = new LocalStackContainer("0.11.6")
    .withServices(S3, SQS)
    .withEnv("DEFAULT_REGION", "eu-central-1");
 
  @BeforeAll
  static void beforeAll() throws IOException, InterruptedException {
    localStack.execInContainer("awslocal", "sqs", "create-queue", "--queue-name", QUEUE_NAME);
    localStack.execInContainer("awslocal", "s3", "mb", "s3://" + BUCKET_NAME);
  }
 
  private static final String QUEUE_NAME = "order-event-test-queue";
  private static final String BUCKET_NAME = "order-event-test-bucket";
 
  // ... actual test
}

您现在可以将其用作模板来准备您的 AWS Lambda 函数。

.zip关于源代码上传,我想将您的 Lambda 版本也挂载或复制到您的容器中然后在内部访问它是有意义的。

可以像下面这样创建 NodeJS lambda:

awslocal lambda create-function \
    --region eu-central1 \
    --function-name your-api \
    --runtime nodejs8.10 \
    --handler lambda.apiHandler \
    --memory-size 128 \
    --zip-file fileb://api-handler.zip

推荐阅读