AWS Observability
made simple
Eóin Shanaghy - Luciano Mammino
AWS Community Day - November 11th 2021
fth.link/o11y-simple
Hi! I’m Eoin 🙂
CTO
aiasaservicebook.com
@eoins
eoins
✉ Get in touch
👋 Hello, I am Luciano
Senior architect
nodejsdesignpatterns.com
Let’s connect:
🌎 loige.co
🐦 @loige
🎥 loige
🧳 lucianomammino
We are business focused technologists
that deliver.
Accelerated Serverless | AI as a Service | Platform Modernisation
We are hiring! Let’s have a chat 🙂
Check out our new Podcast!
awsbites.com
fth.link/o11y-simple
Observability in the cloud
a measure of how well internal states of a
system can be inferred from knowledge of its
external outputs
🪵 🔍 📈 🚨
Structured Logs Tracing Metrics Alarms
“
A typical case study
⚡ Serverless app
● Distributed system (100s of components)
🔌 HTTP APIs using
● Lambda
● DynamoDB
● API Gateway
● Cognito
🧱 Multiple services / stacks
🏁 Using SLIC Starter (fth.link/slic)
173
resources!
A typical case study
⚽ The goal: know about problems before users do
How?
📝 Structured Logs
📐 Metrics
🔔 Alarms
📊 Dashboards
🗺 Traces (X-Ray)
Can we test our observability?
󰝊 We run a stress test
○ Simulate traffic using the integration test
○ Run the test a number of times in parallel (in a loop)
○ Exercises all the APIs with typical use cases (login, CRUD operations, etc.)
🚨 After 10-15 minutes, we started to get alarms...
🚨 Alerts flow!
Making sense of alerts
Initial Hypothesis
🛑 We got throttled (DynamoDB write throttle events)
↪ 🔁 causing AWS SDK retries (in the Lambda function)
↪ ⏱ causing Lambda timeouts
↪ 👎 causing API Gateway 502
🧪 How do we validate this?
1. Check the timeout cause ➡ Lambda metrics/logs
2. Check the Lambda error cause ➡ Lambda logs
3. Identify the source of 5xx errors in API Gateway ➡ X-Ray
4. Check the DynamoDB metrics ➡ Dashboards
Gathering evidence
Checking timeouts
● Check lambda timeouts
○ Duration metrics (aggregated data)
○ Logs (individual requests)
● Logs Insights give us duration for each
individual request. We can use this to
isolate the logs for just that request.
● We use stats to see how many executions
are affected.
Inspecting DynamoDB Capacity
Tracing errors
HTTP 502
HTTP 500
UNEXPECTED! 😱
Lambda CloudWatch
Logs
Conclusions
🌡 Symptom 🐞 Problem 󰟿 Resolution
1 DynamoDB throttles
Table with low provisioned
WCUs (write capacity)
Switch table to
PAY_PER_REQUEST
Add throttling in API Gateway to limit
potential cost impact
2
API 502 Errors
Lambda Timeouts
Throttles caused
DynamoDB retries with
exponential backoff - up to
50 seconds of retry
Change maxRetries to 3 (350ms max
retry)
3 API 500 Errors
Attempt to update a
missing record - problem
with integration test!
Fix the integration test to ensure
deletion occurs after other actions
complete. Also improved the API
design
Before and after
What we have learned so far 󰠅
● We were able to identify, understand and fix these errors quite quickly
● We didn’t have to change the code to do that
● Nor did we run it locally with a debugger
● All of this was possible because we configured observability tools in
AWS in advance
AWS native o11y = CloudWatch
Cloudwatch gives you:
➔ Logs with Insights
➔ Metrics
➔ Dashboards
➔ Alarms
➔ Canaries
➔ Distributed tracing (with X-Ray)
Alternatives outside AWS
Established
New entrants
Roll your own (only for the brave)
CloudWatch out of the box
😍 A toolkit you can use to build
observability
🤩 Metrics are automatically
generated for all services!
😟 Lots of dashboards, but by
service and not by application!
😢 Zero alarms out of the box!
Getting the best out of Cloudwatch
Cloudwatch can be your friend if you...
📚 Research and understand available metrics
📐 Decide thresholds
📊 Write IaC for application dashboards
⏰ Write IaC for service metric alarms
⏪ Update every time your application changes
📋 Copy and paste for each stack in your application
(a.k.a. A LOT OF WORK!)
Best practices
😇 AWS Well Architected Framework
🏛 5 Pillars
⚙ Operational excellence pillar covers observability
🧐 Serverless lens applies these pillars
👍 Good guidance on metrics to observe
👎 More reading and research + you still have to pick thresholds
CloudFormation for CloudWatch Alarms 😬
"Type": "AWS::CloudWatch::Alarm",
"Properties": {
"ActionsEnabled": true,
"AlarmActions": [
"arn:aws:sns:eu-west-1:665863320777:FTSLICAlarms"
],
"AlarmName": "LambdaThrottles_serverless-test-project-dev-hello",
"AlarmDescription": "Throttles % for serverless-test-project-dev-hello ..",
"EvaluationPeriods": 1,
"ComparisonOperator": "GreaterThanThreshold",
"Threshold": 0,
"TreatMissingData": "notBreaching",
"Metrics": [
{
"Id": "throttles_pc",
"Expression": "(throttles / throttles + invocations) * 100",
"Label": "% Throttles",
"ReturnData": true
},
{
"Id": "throttles",
"MetricStat": {
"Metric": {
"Namespace": "AWS/Lambda",
"MetricName": "Throttles",
"Dimensions": [
{
"Name": "FunctionName",
"Value": "serverless-test-project-dev-hello"
}
]
},
"Period": 60,
"Stat": "Sum"
},
"ReturnData": false
},
{
"Id": "invocations",
"MetricStat": {
"Metric": {
"Namespace": "AWS/Lambda",
"MetricName": "Invocations",
Can we automate this?
Magically
generated alarms
and dashboards for
each application!
fth.link/slic-watch
Introducing
SLIC Watch
How SLIC Watch works 🛠
Your app
serverless.yml
sls deploy
CloudFormation stack
very-big.json
SLIC Watch
👀 🛠
CloudFormation stack ++
even-bigger.json
Deploy ☁
📊📈
Before SLIC Watch
After SLIC Watch
After SLIC Watch
After SLIC Watch
After SLIC Watch
After SLIC Watch
Check out SLIC Slack
Configuration
🎀 SLIC Watch comes with sane defaults
📝 You can configure what you don’t like
🔌 Or disable specific dashboards or alarms
How to get started
📣 Create an SNS Topic as the alarm destination (optional)
📦 ❯ npm install serverless-slic-watch-plugin --save-dev
✍ Update serverless.yml
⚙ Configure (optional)
🚢 ❯ sls deploy
plugins:
- serverless-slic-watch-plugin 💡 Check out
the complete
example project
in the repo!
Wrapping up 🎁
★ If your services are failing you definitely want to know about it!
★ Observability can save you from hundreds of hours of blind debugging!
★ CloudWatch is the go to tool in AWS but you have to configure it!
★ Automation can take most of the configuration pain away
★ SLIC Watch can give you this automation
★ You still have control and flexibility
🔬Try it out! 🗣 Give feedback! 🌈 Let’s make it better!
fth.link/slic-watch
Thank you!
fth.link/o11y-simple
Cover picture by Markus Spiske on Unsplash

More Related Content

PDF
2012 ohiolinuxfest replication
PDF
2012 replication
PDF
My sql 56_roadmap_april2012
PDF
My sql susecon_crashcourse_2012
PDF
2012 scale replication
PDF
My sql crashcourse_intro_kdl
PDF
My sql crashcourse_2012
PPTX
Making MySQL highly available using Oracle Grid Infrastructure
2012 ohiolinuxfest replication
2012 replication
My sql 56_roadmap_april2012
My sql susecon_crashcourse_2012
2012 scale replication
My sql crashcourse_intro_kdl
My sql crashcourse_2012
Making MySQL highly available using Oracle Grid Infrastructure

What's hot (20)

PDF
MySQL Shell - The Best MySQL DBA Tool
PDF
MySQL InnoDB Cluster / ReplicaSet - Tutorial
PPTX
How WebLogic 12c Can Boost Your Productivity
PDF
MySQL InnoDB Cluster and Group Replication - OSI 2017 Bangalore
PDF
Changes in WebLogic 12.1.3 Every Administrator Must Know
PDF
MySQL InnoDB Cluster and MySQL Group Replication @HKOSC 2017
PDF
Java EE 7 for WebLogic 12c Developers
PDF
MySQL 5.7: Focus on InnoDB
PDF
WebLogic on ODA - Oracle Open World 2013
PDF
Oracle OpenWorld 2013 - HOL9737 MySQL Replication Best Practices
PDF
Oracle Fusion Middleware on Exalogic Best Practises
PDF
Best Practices - PHP and the Oracle Database
PDF
MySQL 5.7: What's New, Nov. 2015
PDF
MySQL InnoDB Cluster / ReplicaSet - Making Provisioning & Troubleshooting as ...
PPTX
Why Play Framework is fast
PDF
MySQL Group Replication - an Overview
PDF
MySQL InnoDB Cluster: Management and Troubleshooting with MySQL Shell
PDF
Simplifying MySQL, Pre-FOSDEM MySQL Days, Brussels, January 30, 2020.
PPTX
Christo kutrovsky oracle rac solving common scalability problems
PPTX
Oracle Unified Directory. Lessons learnt. Is it ready for a move from OID? (O...
MySQL Shell - The Best MySQL DBA Tool
MySQL InnoDB Cluster / ReplicaSet - Tutorial
How WebLogic 12c Can Boost Your Productivity
MySQL InnoDB Cluster and Group Replication - OSI 2017 Bangalore
Changes in WebLogic 12.1.3 Every Administrator Must Know
MySQL InnoDB Cluster and MySQL Group Replication @HKOSC 2017
Java EE 7 for WebLogic 12c Developers
MySQL 5.7: Focus on InnoDB
WebLogic on ODA - Oracle Open World 2013
Oracle OpenWorld 2013 - HOL9737 MySQL Replication Best Practices
Oracle Fusion Middleware on Exalogic Best Practises
Best Practices - PHP and the Oracle Database
MySQL 5.7: What's New, Nov. 2015
MySQL InnoDB Cluster / ReplicaSet - Making Provisioning & Troubleshooting as ...
Why Play Framework is fast
MySQL Group Replication - an Overview
MySQL InnoDB Cluster: Management and Troubleshooting with MySQL Shell
Simplifying MySQL, Pre-FOSDEM MySQL Days, Brussels, January 30, 2020.
Christo kutrovsky oracle rac solving common scalability problems
Oracle Unified Directory. Lessons learnt. Is it ready for a move from OID? (O...
Ad

Similar to AWS Observability Made Simple (20)

PDF
AWS Observability (without the Pain)
PDF
Serverless in production (O'Reilly Software Architecture)
PDF
AWS Lambda from the trenches (Serverless London)
PDF
AWS Lambda from the Trenches
PDF
Serverless in production, an experience report (microservices london)
PDF
Automatisierte Kontrolle und Transparenz in der AWS Cloud – Autopilot für Com...
PDF
Serverless in production, an experience report (NDC London 2018)
PDF
Serverless in production, an experience report (NDC London, 31 Jan 2018)
PDF
Serverless in production, an experience report (London js community)
PDF
Serverless in production, an experience report (codemotion milan)
PDF
Yan Cui - Serverless in production, an experience report - Codemotion Milan 2017
PDF
Serverless microservices in the wild
PDF
Skillenza Build with Serverless Challenge - Advanced Serverless Concepts
PDF
Aws-What You Need to Know_Simon Elisha
PDF
Build an app on aws for your first 10 million users (2)
PDF
Serverless in production, an experience report (CoDe-Conf)
PDF
Serverless in production, an experience report (JeffConf)
PDF
Serverless in production, an experience report
PDF
Serverless in production, an experience report (FullStack 2018)
PDF
Devops continuousintegration and deployment onaws puttingmoneybackintoyourmis...
AWS Observability (without the Pain)
Serverless in production (O'Reilly Software Architecture)
AWS Lambda from the trenches (Serverless London)
AWS Lambda from the Trenches
Serverless in production, an experience report (microservices london)
Automatisierte Kontrolle und Transparenz in der AWS Cloud – Autopilot für Com...
Serverless in production, an experience report (NDC London 2018)
Serverless in production, an experience report (NDC London, 31 Jan 2018)
Serverless in production, an experience report (London js community)
Serverless in production, an experience report (codemotion milan)
Yan Cui - Serverless in production, an experience report - Codemotion Milan 2017
Serverless microservices in the wild
Skillenza Build with Serverless Challenge - Advanced Serverless Concepts
Aws-What You Need to Know_Simon Elisha
Build an app on aws for your first 10 million users (2)
Serverless in production, an experience report (CoDe-Conf)
Serverless in production, an experience report (JeffConf)
Serverless in production, an experience report
Serverless in production, an experience report (FullStack 2018)
Devops continuousintegration and deployment onaws puttingmoneybackintoyourmis...
Ad

More from Luciano Mammino (20)

PDF
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the ben...
PDF
Did you know JavaScript has iterators? DublinJS
PDF
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
PDF
Building an invite-only microsite with Next.js & Airtable - ReactJS Milano
PDF
From Node.js to Design Patterns - BuildPiper
PDF
Let's build a 0-cost invite-only website with Next.js and Airtable!
PDF
Everything I know about S3 pre-signed URLs
PDF
Serverless for High Performance Computing
PDF
Serverless for High Performance Computing
PDF
JavaScript Iteration Protocols - Workshop NodeConf EU 2022
PDF
Building an invite-only microsite with Next.js & Airtable
PDF
Let's take the monolith to the cloud 🚀
PDF
A look inside the European Covid Green Certificate - Rust Dublin
PDF
Monoliths to the cloud!
PDF
The senior dev
PDF
Node.js: scalability tips - Azure Dev Community Vijayawada
PDF
A look inside the European Covid Green Certificate (Codemotion 2021)
PDF
Semplificare l'observability per progetti Serverless
PDF
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
PDF
Finding a lost song with Node.js and async iterators - EnterJS 2021
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the ben...
Did you know JavaScript has iterators? DublinJS
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
Building an invite-only microsite with Next.js & Airtable - ReactJS Milano
From Node.js to Design Patterns - BuildPiper
Let's build a 0-cost invite-only website with Next.js and Airtable!
Everything I know about S3 pre-signed URLs
Serverless for High Performance Computing
Serverless for High Performance Computing
JavaScript Iteration Protocols - Workshop NodeConf EU 2022
Building an invite-only microsite with Next.js & Airtable
Let's take the monolith to the cloud 🚀
A look inside the European Covid Green Certificate - Rust Dublin
Monoliths to the cloud!
The senior dev
Node.js: scalability tips - Azure Dev Community Vijayawada
A look inside the European Covid Green Certificate (Codemotion 2021)
Semplificare l'observability per progetti Serverless
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
Finding a lost song with Node.js and async iterators - EnterJS 2021

Recently uploaded (20)

PDF
1_Keynote_Breaking Barriers_한계를 넘어서_Charith Mendis.pdf
PDF
CCUS-as-the-Missing-Link-to-Net-Zero_AksCurious.pdf
PDF
Addressing the challenges of harmonizing law and artificial intelligence tech...
PPTX
Report in SIP_Distance_Learning_Technology_Impact.pptx
PDF
ELLIE29.pdfWETWETAWTAWETAETAETERTRTERTER
PDF
Examining Bias in AI Generated News Content.pdf
PDF
Decision Optimization - From Theory to Practice
PDF
substrate PowerPoint Presentation basic one
PPTX
AQUEEL MUSHTAQUE FAKIH COMPUTER CENTER .
PPTX
CRM(Customer Relationship Managmnet) Presentation
PDF
Altius execution marketplace concept.pdf
PDF
Human Computer Interaction Miterm Lesson
PDF
Peak of Data & AI Encore: Scalable Design & Infrastructure
PDF
EGCB_Solar_Project_Presentation_and Finalcial Analysis.pdf
PPTX
From XAI to XEE through Influence and Provenance.Controlling model fairness o...
PDF
Applying Agentic AI in Enterprise Automation
PPTX
Blending method and technology for hydrogen.pptx
PDF
State of AI in Business 2025 - MIT NANDA
PPTX
Rise of the Digital Control Grid Zeee Media and Hope and Tivon FTWProject.com
PDF
TicketRoot: Event Tech Solutions Deck 2025
1_Keynote_Breaking Barriers_한계를 넘어서_Charith Mendis.pdf
CCUS-as-the-Missing-Link-to-Net-Zero_AksCurious.pdf
Addressing the challenges of harmonizing law and artificial intelligence tech...
Report in SIP_Distance_Learning_Technology_Impact.pptx
ELLIE29.pdfWETWETAWTAWETAETAETERTRTERTER
Examining Bias in AI Generated News Content.pdf
Decision Optimization - From Theory to Practice
substrate PowerPoint Presentation basic one
AQUEEL MUSHTAQUE FAKIH COMPUTER CENTER .
CRM(Customer Relationship Managmnet) Presentation
Altius execution marketplace concept.pdf
Human Computer Interaction Miterm Lesson
Peak of Data & AI Encore: Scalable Design & Infrastructure
EGCB_Solar_Project_Presentation_and Finalcial Analysis.pdf
From XAI to XEE through Influence and Provenance.Controlling model fairness o...
Applying Agentic AI in Enterprise Automation
Blending method and technology for hydrogen.pptx
State of AI in Business 2025 - MIT NANDA
Rise of the Digital Control Grid Zeee Media and Hope and Tivon FTWProject.com
TicketRoot: Event Tech Solutions Deck 2025

AWS Observability Made Simple

  • 1. AWS Observability made simple Eóin Shanaghy - Luciano Mammino AWS Community Day - November 11th 2021 fth.link/o11y-simple
  • 2. Hi! I’m Eoin 🙂 CTO aiasaservicebook.com @eoins eoins ✉ Get in touch
  • 3. 👋 Hello, I am Luciano Senior architect nodejsdesignpatterns.com Let’s connect: 🌎 loige.co 🐦 @loige 🎥 loige 🧳 lucianomammino
  • 4. We are business focused technologists that deliver. Accelerated Serverless | AI as a Service | Platform Modernisation We are hiring! Let’s have a chat 🙂
  • 5. Check out our new Podcast! awsbites.com
  • 7. Observability in the cloud a measure of how well internal states of a system can be inferred from knowledge of its external outputs 🪵 🔍 📈 🚨 Structured Logs Tracing Metrics Alarms “
  • 8. A typical case study ⚡ Serverless app ● Distributed system (100s of components) 🔌 HTTP APIs using ● Lambda ● DynamoDB ● API Gateway ● Cognito 🧱 Multiple services / stacks 🏁 Using SLIC Starter (fth.link/slic) 173 resources!
  • 9. A typical case study ⚽ The goal: know about problems before users do How? 📝 Structured Logs 📐 Metrics 🔔 Alarms 📊 Dashboards 🗺 Traces (X-Ray)
  • 10. Can we test our observability? 󰝊 We run a stress test ○ Simulate traffic using the integration test ○ Run the test a number of times in parallel (in a loop) ○ Exercises all the APIs with typical use cases (login, CRUD operations, etc.) 🚨 After 10-15 minutes, we started to get alarms...
  • 12. Making sense of alerts
  • 13. Initial Hypothesis 🛑 We got throttled (DynamoDB write throttle events) ↪ 🔁 causing AWS SDK retries (in the Lambda function) ↪ ⏱ causing Lambda timeouts ↪ 👎 causing API Gateway 502 🧪 How do we validate this? 1. Check the timeout cause ➡ Lambda metrics/logs 2. Check the Lambda error cause ➡ Lambda logs 3. Identify the source of 5xx errors in API Gateway ➡ X-Ray 4. Check the DynamoDB metrics ➡ Dashboards
  • 15. Checking timeouts ● Check lambda timeouts ○ Duration metrics (aggregated data) ○ Logs (individual requests) ● Logs Insights give us duration for each individual request. We can use this to isolate the logs for just that request. ● We use stats to see how many executions are affected.
  • 21. Conclusions 🌡 Symptom 🐞 Problem 󰟿 Resolution 1 DynamoDB throttles Table with low provisioned WCUs (write capacity) Switch table to PAY_PER_REQUEST Add throttling in API Gateway to limit potential cost impact 2 API 502 Errors Lambda Timeouts Throttles caused DynamoDB retries with exponential backoff - up to 50 seconds of retry Change maxRetries to 3 (350ms max retry) 3 API 500 Errors Attempt to update a missing record - problem with integration test! Fix the integration test to ensure deletion occurs after other actions complete. Also improved the API design
  • 23. What we have learned so far 󰠅 ● We were able to identify, understand and fix these errors quite quickly ● We didn’t have to change the code to do that ● Nor did we run it locally with a debugger ● All of this was possible because we configured observability tools in AWS in advance
  • 24. AWS native o11y = CloudWatch Cloudwatch gives you: ➔ Logs with Insights ➔ Metrics ➔ Dashboards ➔ Alarms ➔ Canaries ➔ Distributed tracing (with X-Ray)
  • 25. Alternatives outside AWS Established New entrants Roll your own (only for the brave)
  • 26. CloudWatch out of the box 😍 A toolkit you can use to build observability 🤩 Metrics are automatically generated for all services! 😟 Lots of dashboards, but by service and not by application! 😢 Zero alarms out of the box!
  • 27. Getting the best out of Cloudwatch Cloudwatch can be your friend if you... 📚 Research and understand available metrics 📐 Decide thresholds 📊 Write IaC for application dashboards ⏰ Write IaC for service metric alarms ⏪ Update every time your application changes 📋 Copy and paste for each stack in your application (a.k.a. A LOT OF WORK!)
  • 28. Best practices 😇 AWS Well Architected Framework 🏛 5 Pillars ⚙ Operational excellence pillar covers observability 🧐 Serverless lens applies these pillars 👍 Good guidance on metrics to observe 👎 More reading and research + you still have to pick thresholds
  • 29. CloudFormation for CloudWatch Alarms 😬 "Type": "AWS::CloudWatch::Alarm", "Properties": { "ActionsEnabled": true, "AlarmActions": [ "arn:aws:sns:eu-west-1:665863320777:FTSLICAlarms" ], "AlarmName": "LambdaThrottles_serverless-test-project-dev-hello", "AlarmDescription": "Throttles % for serverless-test-project-dev-hello ..", "EvaluationPeriods": 1, "ComparisonOperator": "GreaterThanThreshold", "Threshold": 0, "TreatMissingData": "notBreaching", "Metrics": [ { "Id": "throttles_pc", "Expression": "(throttles / throttles + invocations) * 100", "Label": "% Throttles", "ReturnData": true }, { "Id": "throttles", "MetricStat": { "Metric": { "Namespace": "AWS/Lambda", "MetricName": "Throttles", "Dimensions": [ { "Name": "FunctionName", "Value": "serverless-test-project-dev-hello" } ] }, "Period": 60, "Stat": "Sum" }, "ReturnData": false }, { "Id": "invocations", "MetricStat": { "Metric": { "Namespace": "AWS/Lambda", "MetricName": "Invocations",
  • 30. Can we automate this? Magically generated alarms and dashboards for each application!
  • 32. How SLIC Watch works 🛠 Your app serverless.yml sls deploy CloudFormation stack very-big.json SLIC Watch 👀 🛠 CloudFormation stack ++ even-bigger.json Deploy ☁ 📊📈
  • 38. After SLIC Watch Check out SLIC Slack
  • 39. Configuration 🎀 SLIC Watch comes with sane defaults 📝 You can configure what you don’t like 🔌 Or disable specific dashboards or alarms
  • 40. How to get started 📣 Create an SNS Topic as the alarm destination (optional) 📦 ❯ npm install serverless-slic-watch-plugin --save-dev ✍ Update serverless.yml ⚙ Configure (optional) 🚢 ❯ sls deploy plugins: - serverless-slic-watch-plugin 💡 Check out the complete example project in the repo!
  • 41. Wrapping up 🎁 ★ If your services are failing you definitely want to know about it! ★ Observability can save you from hundreds of hours of blind debugging! ★ CloudWatch is the go to tool in AWS but you have to configure it! ★ Automation can take most of the configuration pain away ★ SLIC Watch can give you this automation ★ You still have control and flexibility 🔬Try it out! 🗣 Give feedback! 🌈 Let’s make it better! fth.link/slic-watch
  • 42. Thank you! fth.link/o11y-simple Cover picture by Markus Spiske on Unsplash