amazon-web-servicesamazon-elastic-beanstalkebextensions

AWS Elastic Beanstalk unable to deploy a working version


Elastic Beanstalk is infinitely copying a file to the /tmp folder that I created with a config file in .ebextensions. The name of this file is /tmp/mount-efs.sh. This file causes an issue on initialisation of an environment. So I try to get rid of it or at least change the content of it.

I tried already:

I think Elastik Beanstalk is stuck with a version that it thinks works. But the version has an issue. And EB does not allow me to deploy a different version (older or newer).

The stranger thing is, that the version, that EB every time fallback to, did not have the file in the .ebextensions.

I also tried to rebuild the environment. Result: Fallback is loaded, file is there, issue happens.

from eb-engine.log:

Running command /bin/sh -c /opt/aws/bin/cfn-init -s arn:aws:cloudformation:us-west-2:xxxxxxxxxxxx:stack/awseb-e-xxxxxxxxxxx-stack/nnnnnnnn-nnnn-nnnn-nnnn-xxxxxxxxxxxx -r AWSEBAutoScalingGroup --region us-west-2 --configsets Infra-EmbeddedPreBuild
2022/07/14 20:31:13.403626 [INFO] Error occurred during build: Command 01_mount failed

2022/07/14 20:31:13.403667 [ERROR] An error occurred during execution of command [self-startup] - [PreBuildEbExtension]. Stop running the command. Error: EbExtension build failed. Please refer to /var/log/cfn-init.log for more details. 

This error happens every 5 sec. So EB is in an infinite loop here. So I want to get rid of the /tmp/mount-efs.sh file, or that the content of /tmp/mount-efs.sh is different. I want to do this directly via ssh on the ec2 instance it self.

So my understanding is, that EB runs the config files that I added in .ebextensions. In this files there are files created in the /tmp folder. This files in the /tmp folder run on initialization.

So what file I have to change, so that the changes are recognized in the file, that is created in the /tmp folder (without deployment)?

Or can I stop the initialization loop somehow?


Solution

  • The infinity loop happens because of a command that calls a file in /var/www/html that did not exist. Why this file did not exist is a riddle for me. The whole /var/www/html folder was empty. Normally elastic beanstalk should do the stuff before running the commands, but this is not the case. (create app folder and staging, unzip the source code into staging, copy it into the app/current folder, and create a symlink to the app/current folder)

    I was able to solve the issue with the infinity loop by doing the following:

    sudo mkdir -p /var/app/staging
    cd $_
    sudo unzip /opt/elasticbeanstalk/deployment/app_source_bundle
    sudo cp -rpv /var/app/staging /var/app/current
    sudo rm -rf /var/www/html
    sudo ln -s /var/app/current /var/www/html
    

    mkdir -p: creates the directories with parent. so if "app" not exists it will be created before "staging" will be created

    $_: Reference to the last folder "in action". here this was /var/app/staging

    unzip: unzip the source bundle code into staging

    cp -rp: copy recursively (r) and keep ownership and timestamps (p) from "staging" into "current"

    rm -rf /var/www/html: deletes the existing HTML folder. Be careful with this command what you delete!

    ln -s : creates a symbolic link from /var/www/html to /var/app/current