Jeff Tilton
11/12/2020, 4:45 AM2020-11-11 20:29:01 - dagster - DEBUG - inputs_pipeline - 7480db29-cf8b-4e18-b69c-6695a58b6867 <- uuid
Any advice on how to apply serverless to dagster?sashank
11/12/2020, 5:10 AM@solid
def my_solid(_):
client = boto3.client("lambda")
payload = {...}
response = client.invoke(
FunctionName="my-function-name",
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
return json.loads(response["Payload"].read()
You can take the response, process it however you like (transform it, upload it to a db, etc), and pass the result to downstream solids where you can call other lambda functionsJeff Tilton
11/12/2020, 5:13 AMsashank
11/12/2020, 5:14 AM@solid
def my_solid(context)
run_id = context.pipeline_run.run_id
Jeff Tilton
11/12/2020, 5:14 AMsashank
11/12/2020, 5:16 AMJeff Tilton
11/12/2020, 5:18 AMsashank
11/12/2020, 5:18 AM@solid
def my_solid(_):
client = boto3.client("lambda")
payload = {...}
response = client.invoke(
FunctionName="my-function-name",
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
return json.loads(response["Payload"].read()
@solid
def my_second_solid(_, my_input):
# Use my input in this solid
client = boto3.client("lambda")
payload = {...}
response = client.invoke(
FunctionName="my-second-function-name",
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
@pipeline
def my_pipeline():
my_second_solid(my_solid())
Jeff Tilton
11/12/2020, 5:23 AMsashank
11/12/2020, 5:59 AM@resource
def lambda_resource(context):
client = boto3.client("lambda")
def invoke(function_name, payload):
response = client.invoke(
FunctionName=function_name,
LogType="Tail",
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
<http://context.log.info|context.log.info>(base64.b64decode(response["LogResult"]))
return json.loads(response["Payload"].read())
return invoke
@solid(required_resource_keys={"lambda_resource"})
def my_solid(context):
response = context.resources.lambda_resource("my-function", payload={...})
return ...
AssetMaterialization
that stores a reference to the cloudwatch logs so you can go inspect them as necessary:
@resource
def lambda_resource(context):
client = boto3.client("lambda")
def invoke(function_name, payload):
response = client.invoke(
FunctionName=function_name,
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
# Generate url to cloudwatch logs
url = generate_cloudwatch_log_url(response)
yield AssetMaterialization(
asset_key="lambda_logs:{}".format(function_name),
metadata_entries=[EventMetadataEntry.url(label="CloudWatch Logs", url=url],
)
return json.loads(response["Payload"].read())
return invoke
Jeff Tilton
11/12/2020, 4:34 PMsashank
11/24/2020, 7:37 PM