将 Pulumi S3 Bucket ID 作为参数传递给 AWS Lambda

Passing Pulumi S3 Bucket ID to AWS Lambda as a parameter

我想通过 Pulumi 将 S3 存储桶 ID 作为参数传递给 AWS Lambda。 但是,Pulumi 传递了这个参数On Build,所以我在 Lambda 中获取了一个 Object 引用,而不是 S3 路径。

我的代码是这样的

bucket = s3.Bucket(resource_name="bucket", acl="private")
lambda_func = lambda_.Function("Function",
                               role=lambda_role.arn,
                               package_type="Image",
                               image_uri=docker.image_name,
                               image_config={"commands": ["api/main.handler"]},
                               vpc_config={"subnet_ids": private_subnet_ids,
                                           "security_group_ids": [internet_access.id],
                                          },
                               environment=lambda_.FunctionEnvironmentArgs(
                                               variables={"STORE_PATH": f"s3://s{bucket.id}/api"})
                               )

根据 Pulumi documentation:

Outputs that contain strings cannot be used directly in operations such as string concatenation.

所以我尝试了推荐的方法,例如:

bucket_url = Output.all(bucket.id).apply(lambda l: f"http://{l[0]}/")

url = Output.concat("http://", bucket.id, "/")

欢迎任何帮助。提前谢谢大家。

最后一种方法应该可以正常工作。请注意 bucket.id 只是存储桶的名称,您需要使用它构建 S3 访问 URL,例如

url = Output.concat("https://", bucket.id, ".s3.us-west-2.amazonaws.com")
# or url = Output.concat("s3://", bucket.id)

如果这仍然不能满足您的要求,您可以导出 url 的值以查看它的错误(或 post 您问题的结果)。

export('url', url)

发生这种情况是因为 lambda 函数的环境变量字段需要一个字符串。我们需要告诉 Pulumi 确保 bucket id 已解析(即,bucket 已完成创建并且输出已返回)

如果像这样将 Output.concat 传递给 lambda 函数,它会起作用:

lambda_func = aws.lambda_.Function(
    "function",
    runtime="python3.7",
    role=role.arn,
    handler="hello_world.handler",
    code=pulumi.AssetArchive({".": pulumi.FileArchive(".")}),
    environment=aws.lambda_.FunctionEnvironmentArgs(
        variables={"STORE_PATH": pulumi.Output.concat("s3://", bucket.id, "/")}
    ),
)