Repository navigation
sam local start-api fails to move /var/rapid/aws-lambda-rie-x86_64 in docker image for serverless function #3891
Description
Activity
Thanks for bringing this to our attention! Could you include a basic sample template, handler, and Dockerfile (and anything else necessary) so that we could reproduce this issue more easily and accurately?
- addedblocked/more-info-neededMore info is needed from the requester. If no response in 14 days, it will become stale.More info is needed from the requester. If no response in 14 days, it will become stale.area/local/start-apisam local start-api commandsam local start-api commandstage/bug-reproThe issue/bug needs to be reproducedThe issue/bug needs to be reproduced
on May 20, 2022 Yes, I'll give it a look when I'll have time
Reacted by Ruperto TorresI have just run into this issue and it affects
sam local invokeetc.TL;DR: Lambda functions default to Linux/x86_64 architecture even when run locally with SAM. On Linux for arm/aarch(64) only the Docker Engine/CE is available to install. Unlike for Docker Desktop, CE doesn't include QEMU emulation configuration for other platforms (specifically Linux/x86_64). Third-party binfmt is needed. This on very light testing appears to resolve the issue for SAM.
Longer version:
docker ps -a and info shows the command that fails:
"mv /var/rapid/aws-lambda-rie-x86_64 /var/rapid/aws-lambda-rie && chmod +x /var/rapid/aws-lambda-rie"Additional environment details:
OS: Fedora Linux 36 (ARM64) - Parallels VM on Macbook M1 sam --version: SAM CLI, version 1.56.0 AWS region: eu-central-1It is fairly easy to reproduce. Just create the hello-world sam app via
$ sam initin an empty directory:
1 - AWS Quick Start Templates
1 - Hello World Example$ sam local invoke HelloWorldFunction Invoking app.lambda_handler (python3.9) Image was not found. Removing rapid images for repo public.ecr.aws/sam/emulation-python3.9 Building image................... Failed to build Docker Image NoneType: None Error: Error building docker image: The command '/bin/sh -c mv /var/rapid/aws-lambda-rie-x86_64 /var/rapid/aws-lambda-rie && chmod +x /var/rapid/aws-lambda-rie' returned a non-zero code: 1The problem is due to a platform mismatch - attempting to run x86_64 images on arm64 architecture. Ordinarily with Docker Desktop on x86_64 it's possible to emulate other architectures such as arm64.
Per the AWS SAM document here https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html it states:
On Linux, to build and run Lambda functions with a different instruction set architecture than your host machine, you must take additional steps to configure Docker. For example, to run arm64 functions on an x86_64 machine, you can run the following command to configure the Docker daemon: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes.However,
multiarch/qemu-user-staticonly supports the x86_64 host architecture per https://github.com/multiarch/qemu-user-static/.I did find this and have managed to get it working for SAM: https://github.com/tonistiigi/binfmt.
Reacted by Jon Griffith, Alex McLean and Kobe- addedstage/needs-investigationRequires a deeper investigationRequires a deeper investigationand removedblocked/more-info-neededMore info is needed from the requester. If no response in 14 days, it will become stale.More info is needed from the requester. If no response in 14 days, it will become stale.
on Dec 5, 2022 Hi I am running into same issue, any update on the thread please?
3 remaining items
Hi @mjvirt I'm also having this same issue when using an M1 Mac running macOS 13.1.
I changed the template.yml
Architecturetoarm64, reransam buildand thensam local invoke --no-eventworked for me.Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs18.x Architectures: - arm64 # Update this line for it to work locally
Reacted by Muhammad Hussain and Louie de la RosaReacted by Jafar 𒂼𒄄 and DimiHi @chrisrhymes and others, maybe I wasn't clear in my original message above, but this last line works:
I did find this and have managed to get it working for SAM: https://github.com/tonistiigi/binfmt (other CPU architecture emulation on arm64/M1)
In other words you can emulate x86_64 on arm64 - and it works fine with SAM/CDK - at least insofar as I've tested it (just use
docker run --privileged --rm tonistiigi/binfmt --install allto install the available platform emulators; or you can be more picky...).Reacted by CS Rhymes and Parker HranickyReacted by Parker HranickyThanks, I should have said before, but I tried running the command, but only for arm64
--install arm64and it still didn't work.I just tried the
docker run --privileged --rm tonistiigi/binfmt --install allcommand which all looks ok, ransam buildand thensam local start-apiand I get the same error as before:Error building docker image: The command '/bin/sh -c mv /var/rapid/aws-lambda-rie-x86_64 /var/rapid/aws-lambda-rie && chmod +x /var/rapid/aws-lambda-rie' returned a non-zero code: 1@chrisrhymes I managed to fix this by executing the following commands
$ brew uninstall aws-sam-cli $ brew install rust $ brew install aws/tap/aws-sam-cliReacted by CS Rhymes and KobeReacted by Kobe and Jack DeckerReacted by Kobe@chrisrhymes I managed to fix this by executing the following commands
$ brew uninstall aws-sam-cli $ brew install rust $ brew install aws/tap/aws-sam-cliGot an error from the last command
brew install aws/tap/aws-sam-cliAlready downloaded: /Users/haithai/Library/Caches/Homebrew/downloads/563186ab187d77b0c27b2db3c0f3fc5d25300867da5d18083dd099e13ce4431b--aws-aws-sam-cli-v1.71.0-0-gc681067.tar.gz Error: aws-sam-cli: SHA256 mismatch Expected: c27333fb067fd0ffef723c48ed9f26272061d6f3299f5b00ee3d421cc607e0c5 Actual: e05774257d3bbf0080d7d0f0114991bfaf44a9d5bc464cc1427ccc98a4c99cd6 File: /Users/haithai/Library/Caches/Homebrew/downloads/563186ab187d77b0c27b2db3c0f3fc5d25300867da5d18083dd099e13ce4431b--aws-aws-sam-cli-v1.71.0-0-gc681067.tar.gz To retry an incomplete download, remove the file above
I tried to remove and run install again - The error still happening @ixolt
Thanks @ixolt
The new version of AWS SAM CLI - (ノ◕ヮ◕)ノ*:・゚✧ The problem Fixed
$ brew uninstall aws-sam-cli $ brew install rust $ brew tap aws/tap $ brew install aws-sam-cli
Reacted by Sergio BilelloReacted by Alex PoliukhI'm having the same issue on SAM 1.71.0 (latest) and the emulator install is not resolving it.
I solved it by
$ rm -rf /usr/local/bin/samInstalling sam via pkg file from https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
MacBook Pro M1For an M1 Mac, you can pass the architecture flag
-atosam initlike:sam init -a arm64.Or you could change your Architectures line in your template.yaml like @chrisrhymes described above.
I wrote about it a bit more in this Stack Overflow answer: https://stackoverflow.com/questions/75216548/aws-sam-cli-throws-error-error-building-docker-image/75342572#75342572
I think the ideal solution would be for SAM to detect your architecture and act accordingly when creating a Docker image for emulating Lambda locally, while allowing for the Architectures to specify the deployment architecture of the Lambda function. Currently it looks SAM uses the Architectures line for both.
Moving this issue to discussions: https://github.com/aws/aws-sam-cli/discussions/4705
⚠️ COMMENT VISIBILITY WARNING⚠️ Comments on closed issues are hard for our team to see.
If you need more assistance, please either tag a team member or open a new issue that references this one.
If you wish to keep having a conversation with other community members under this issue feel free to do so.- locked and limited conversation to collaborators
on Feb 13, 2023
Description:
Accessing a lambda using a custom docker image with python awslambdaric fails with:
Steps to reproduce:
Create a serverless function with a custom docker image that uses awslambdaric try to access it through an HttpApi locally.
Observed result:
Expected result:
Should just work or tell how to fix the issue with moving rapid/aws-lambda-rie
Additional environment details (Ex: Windows, Mac, Amazon Linux etc)
sam --version: 1.50.0