A little under a year ago we released the ability to run a Fleet via webhook and send custom parameters. This feature has allowed our users to scale up their use cases and spend more time providing ROI to their stakeholders.
The biggest feedback that we received on the feature was to be able to provide parameters for our native low-code Blueprints at runtime. That feature was not available until today. With Shipyard's new Trigger Fleet Runs API endpoint, you can now take a single Fleet and send a request with JSON that can override any environment variable of your choosing including Blueprint Variables.
To show off the new API endpoint, I want to use a popular use case as a demo. In this blog post, I will use our new Trigger Fleet Runs API endpoint to start a Fleet that will download a query from Snowflake as a CSV and email it to a stakeholder.
If you'd rather watch this walk-through versus read, check out the video below:
Building a Starting Fleet
To start the process, we will need to create a Fleet as a template where we can send parameters at runtime. Our Fleet will contain two Vessels. One Vessel is built using the Snowflake Blueprint to Store Query Results as CSV. The second Vessel is built using the Email Blueprint to Send a Message with a File.
For the inputs, I am including my authentication information in the Vessels since I do not plan to change that information at run time. However, the information about the query and email will be changed at runtime, so I am including dummy data for those fields. You can see the full template Fleet setup that we are starting with below.
name: Template Fleet for API
_id: f6345faf-6340-46f3-bea9-6cac07d2eafa
vessels:
Download Snowflake Query:
_id: 7cefdb94-23cc-4731-9567-9e45267fbb9c
source:
blueprint: Snowflake - Store Query Results as CSV
inputs:
SNOWFLAKE_ACCOUNT: '#{SNOWFLAKE_DEMO.SNOWFLAKE_ACCOUNT}'
SNOWFLAKE_DATABASE: SNOWFLAKE_SAMPLE_DATA
SNOWFLAKE_DESTINATION_FILE_NAME: template.csv
SNOWFLAKE_DESTINATION_FOLDER_NAME: null
SNOWFLAKE_FILE_HEADER: true
SNOWFLAKE_PASSWORD: SHIPYARD_HIDDEN
SNOWFLAKE_QUERY: fake query
SNOWFLAKE_SCHEMA: PUBLIC
SNOWFLAKE_USERNAME: '#{SNOWFLAKE_DEMO.SNOWFLAKE_USERNAME}'
SNOWFLAKE_WAREHOUSE: TEST_WH
type: BLUEPRINT
guardrails:
retry_count: 1
retry_wait: 0s
runtime_cutoff: 4h0m0s
exclude_exit_code_ranges:
- 200-206
notifications:
emails:
after_error: true
after_on_demand: false
Email Snowflake Data:
_id: 2a569aa3-366a-4edd-8a53-23e73e2941c0
source:
blueprint: Email - Send Message with File
inputs:
EMAIL_BCC: null
EMAIL_CC: null
EMAIL_INCLUDE_SHIPYARD_FOOTER: true
EMAIL_MESSAGE: Attached
EMAIL_PASSWORD: SHIPYARD_HIDDEN
EMAIL_SEND_METHOD: tls
EMAIL_SENDER_ADDRESS: ${EMAIL_USERNAME}
EMAIL_SENDER_NAME: null
EMAIL_SMTP_HOST: '#{DEMO_EMAIL_CREDS.EMAIL_SMTP_HOST}'
EMAIL_SMTP_PORT: '#{DEMO_EMAIL_CREDS.EMAIL_SMTP_PORT}'
EMAIL_SOURCE_FILE_NAME: template.csv
EMAIL_SOURCE_FILE_NAME_MATCH_TYPE: exact_match
EMAIL_SOURCE_FOLDER_NAME: null
EMAIL_SUBJECT: Snowflake Query
EMAIL_TO: template@shipyardapp.com
EMAIL_USERNAME: '#{DEMO_EMAIL_CREDS.EMAIL_USERNAME}'
type: BLUEPRINT
guardrails:
retry_count: 1
retry_wait: 0s
runtime_cutoff: 4h0m0s
notifications:
emails:
after_error: true
after_on_demand: false
connections:
Download Snowflake Query:
Email Snowflake Data: SUCCESS
notifications:
emails:
- steven.johnson@shipyardapp.com
after_error: true
after_on_demand: false
Choosing Fields to Change at Runtime
In the YAML above, you can see the two Vessels named Download Snowflake Query and Email Snowflake Data along with the variables for each Vessel below them. Using the new API endpoint, we are allowed to change any of those variables at runtime.
The variables that we are going to change in this demo are:
Download Snowflake Query:
- SNOWFLAKE_DESTINATION_FILE_NAME
large_manu_4.csv
- SNOWFLAKE_QUERY
select *
from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1000"."PART"
where P_MFGR = 'Manufacturer#4' and P_SIZE = 50
limit 100
Email Snowflake Data
- EMAIL_SOURCE_FILE_NAME
large_manu_4.csv
- EMAIL_TO
steven.johnson@shipyardapp.com
Run the Fleet with the API
Using the example code in the Shipyard documentation, we can now run our template Fleet from earlier with the custom variables from above. The custom variables will need to be input into a dictionary:
json_data = {
"vessel_overrides": [
{
"name": "Download Snowflake Query",
"environment_variable_overrides": {
"SNOWFLAKE_DESTINATION_FILE_NAME": "large_manu_4.csv",
"SNOWFLAKE_QUERY": '''
select * from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1000"."PART" where P_MFGR = 'Manufacturer#4' and P_SIZE = 50 limit 100
'''
}
},
{
"name": "Email Snowflake Data",
"environment_variable_overrides": {
"EMAIL_SOURCE_FILE_NAME": "large_manu_4.csv",
"EMAIL_TO": "steven.johnson@shipyardapp.com"
}
}
]
}
The json_data variable will now be sent to the Shipyard API. This will start the fleet with the custom variables replacing the template variables from above. The code below will accomplish that. All you will need to do is input your Shipyard API key, organization, project, and Fleet IDs:
import requests
headers = {
'Accept': 'application/json',
'X-Shipyard-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
}
response = requests.post(
'https://api.app.shipyardapp.com/orgs/<YOUR_ORG_ID>/projects/<YOUR_PROJECT_ID/fleets/<YOUR_FLEET_ID>/fleetruns',
headers=headers,
json=json_data,
)
The Fleet runs with the variables that are provided, and the data is emailed over. With this setup, we can continue to update the variables from above to run the same Fleet but with different variables. Say goodbye to having to duplicate a Fleet over and over again to send different reports to different stakeholders.