As you know, I’ve blogged a fair amount recently about calling AWS services from Haskell. I’ve also demonstrated a close-to-minimal Haskell program that can itself run inside AWS Lambda using the
serverless-haskell package. Since those experiments, I’ve tried to get my AWS Lambda program to something useful and have, unfortunately, run into a wall. Today, I’m going to talk about some of the issues I’ve encountered:
First, I tried to extend my
HLambda program to call the STS
GetCallerIdentity API just to dump my account ID to the log during executing of my Lambda function. This didn’t work. My original Lambda function used the
AWSLambdaBasicExecutionRole security role. I tried increases the privileges granted to my function, even going so far as adding full
AdministratorAccess to my function’s role. None of this allowed my call to this API to succeed. In fact, the call seems to “go nowhere” and never returns. Unable to debug this, even with some metrics from X-Ray, I abandoned this.
Next, I tried calling various SSM APIs such as
PutParameter after adding the
AmazonSSMFullAccess policy to my role. At some point this worked. I even had my function successfully reading and writing
SecureString parameters. And, then, it mysteriously stopped working. Unfortunately, I was not able to roll my program back to a working state. Nothing I was able to do to tweak my security policy etc. seemed to have any effect.
I then thought I’d pare things down to the bare minimum. I was able to write to the CloudWatch log simply by writing to standard output using
putStrLn. However, presumably due to the way the logs are buffered, not all of my messages would be visible in CloudWatch. I, therefore, created a
logMessage function to ensure that the message is proactively flushed:
That got things to reliably show up in the log.
I then thought I’d build on that my building a minimal HTTP client using Req:
This, unfortunately, suffered from the same affliction as my attempts to call into AWS APIs: the call simply doesn’t not return. I’m wondering if, somehow, my AWS Lambda environment does not have access to the Internet, though I haven’t been able to positively confirm this one way or another.
So, I’m stumped.
It’s possible that I’m running into difficulties because I’m building my program inside an Ubuntu 16.04 virtual machine running on VirtualBox instead of the Amazon Linux OS running inside the AWS Lambda execution environment. Perhaps, I am generating binaries that are incompatible in some way or failing due to a missing native function at runtime.
So, I decided to try to emulate this environment as closely as possible…
ec2-user) has no password by default. I, therefore, grabbed this ISO which sets the password to
sudoers, add my SSH public key and log into over
By the way, I avoided following the official instructions, because I’m lazy.
I then proceeded to get a Haskell build environment set up with Stack and other dependencies:
I’ll let you know how this goes!
All content © 2019 Richard Cook. All rights reserved.