Fork me on GitHub

Having problems with lein-clj-lambda. I have a brand new AWS free tier account, and I just created a new IAM user. I installed the aws cli, and ran aws configure --profile adminuser, and for instance I can successfully run aws lambda list-functions --profile adminuser.


But if I try running lein lambda -h from my clojure project I get a warning like this:

Oct 25, 2017 4:09:50 PM com.amazonaws.auth.profile.internal.BasicProfileConfigLoader loadProfiles
WARNING: The legacy profile format requires the 'profile ' prefix before the profile name. The latest code does not require such prefix, and will consider it as part of the profile name. Please remove the prefix if you are seeing this warning.


So taking that warning at face value, I edited ~/.aws/config accordingly and discovered the lein plugin works but the AWS CLI no longer works. Making a mental note but moving on…


Now lein lambda install test fails. What it does do is build the uberjar, creates an IAM role, creates the S3 bucket, uploads the jar to the bucket. But it fails to create the lambda function itself, throwing an exception instead The role defined for the function cannot be assumed by Lambda. (Service: AWSLambda; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)


Maybe check what version of the AWS CLI it expects to use?


It may not be liking the newer versions


The plugin doesn’t appear to be using the CLI itself, rather it’s using clj-lambda which in turn is a wrapper around the AWS java sdk. But point taken, I took the latest version of that java sdk so maybe I need to walk it back.


@gonewest818: have you looked into #portkey ? I've been using it for the past few days, and 1. it's amazing, 2. the devs hangout in #portkey, and 3. they are very responsive to github issues


I always got confused with the aws configure and passing --profile switch around. It gets especially messy when working in multiple projects that involve several AWS accounts. Nowadays my workflow is that I have script in each project directory which exports environment variables for aws-cli (and possibly other config as well). So when I switch to a project, I cd to project folder, run source .env and aws-cli is properly configured. Also aws-sdk will pick the configuration from environment variables when they’re set.


@qqq I will take a look. I did successfully revert the lein-clj-lambda dependency and got my ring-aws-lambda-adapter based lambda function uploaded and invokable. With this ring adapter I’m failing to understand (my fault, I’m skimming the docs as I go) what route gets called and how the parameters are presented in the request map, but at least I can see logs and know that the function is invokable. That’s a step ahead.


So @gonewest818 you could try just setting

export AWS_ACCESS_KEY_ID=xxxxx
export AWS_DEFAULT_REGION=us-east-1 # or whatever region you're targeting
Both aws-cli and aws-sdk are expected to pick config from env vars. EDIT: fixed wrong secret access key variable name


I tried setting those but e.g. AWS_DEFAULT_REGION was ignored and the lein plugin would throw exceptions insisting I needed to specify a region anyway. Frustrating, to say the least. So I backed up to an older version of the plugin (one that predates a commit that claimed to change region setting). It was a lucky guess, but now at least I can deploy.


Ahhh yeah was it so that aws-cli expects AWS_DEFAULT_REGION and the sdk AWS_REGION.. so you probably need to set both.

export AWS_DEFAULT_REGION=us-east-1
Yep, checked my own scripts and that’s how I usually have them set.


@gonewest818: my minimal aws-lambda-portkey config is literally:

1. run 'aws configure'

  (:require [portkey.core :as pk]))

(defn h2 []
  (str "trying again this time with boot function"))

(pk/mount! h2 "/" :lambda-function-name "fn-live")


the zip file generated is around 5.6 MB and takes about 2-3 seconds to upload