Create Amazon Linux 2 instance via CodeStar - amazon-ec2

I have created a Java Web application with Elastic Beanstalk using AWS CodeStar. The application works, no problem there. But the EC2 instance the Elastic Beanstalk provisioned is running Amazon Linux 1. I need to have Amazon Linux 2, because some of the things I want to install there run only on Amazon Linux 2. The AMI used for the instance is aws-elasticbeanstalk-amzn-2018.03.0.x86_64-tomcat8.5java8-hvm-202102251130.
When you are creating a project via CodeStar, you can only select instance type (I selected t3.micro for start). There is no way to select operating system. You also cannot specify OS in the EC2 console or Elastic Beanstalk console. Solution might be to select a different AMI in the Auto-scaling group, but I am not sure if the template provided by CodeStar will work on AL2, since it was built for AL1.
So my question is:
Is there an easy way to get a AL2 instance for a CodeStar project?
If the only solution is to specify AMI, which one should it be and how to make sure my project will work there?

There are two ways to change it, but I don't know if forcing EB platform version change won't break some CodeStar compatibilities. Anyway, you can give it a go, if you want.
First option, you can go to your source code repo, and open template.yml. Find line SolutionStackName: !Ref 'SolutionStackName' and change to which platform you want, e.g.:
SolutionStackName: 64bit Amazon Linux 2 v4.1.6 running Tomcat 8.5 Corretto 11
The change should trigger re-deployment of your CodeStar project and EB env.
Or second option, go to CodePiepline of your CodeStar project and edit Deploy stage's GenerateChangeSet action. In the Advanced settings of the action, got to Parameter overrides and "SolutionStackName":"64bit Amazon Linux 2018.03 v3.4.4 running Tomcat 8.5 Java 8", to what you want, e.g.:
"SolutionStackName":"64bit Amazon Linux 2 v4.1.6 running Tomcat 8.5 Corretto 11",
Please not that you may need also to add permissions to the role CodePipeline uses for CloudFormation. The name of the role can be found in GenerateChangeSet action details. Once you have the name, you can go to IAM console, and add missing permissions. In my test, I did try to find minimum needed permissions, so I just added bunch of them (bad practice):
AmazonEC2FullAccess
AdministratorAccess-AWSElasticBeanstalk
AWSCloudFormationFullAccess
Finally, the demo application that CodeStar uses probably will not work with the updated environment as it was designed for older EB platforms, not new ones.

Related

Pattern to deploy AWS Beanstalk in laravel

I have been following this guide:
https://deliciousbrains.com/scaling-laravel-using-aws-elastic-beanstalk-part-3-setting-elastic-beanstalk/
However I am stuck at this point.
Not in terms of something not working, but in how it should be done properly. Which app I should deploy?
Is is the development app that is tested and deployed? Do I create another instance in AWS that will be only used to deploy ready apps? What is the pattern to follow?
At the moment I have local development server which runs on my PC, and also 1 Development instance EC2 on AWS. Do I need more than that on top of Elastic beanstalk?
Please advice me! Thanks!
The following pattern is the one that best fits your need. You're not just looking for a pattern, but an architecture. I'll try to help you with the information you provided.
First it is important that you really understand what Beanstalk is and how it works. See: http://docs.aws.amazon.com/en/elasticbeanstalk/latest/dg/Welcome.html
Answering your question, applications are typically placed in the beanstalk for scalable production, but nothing prevents you from setting up development environments for testing, too.
You do not need to create an instance to deploy, you can deploy from your own local machine, using the console, cli, or api. Look:
Console: https://sa-east-1.console.aws.amazon.com/elasticbeanstalk/home
EB Cli: http://docs.aws.amazon.com/en/elasticbeanstalk/latest/dg/eb-cli3.html
API: http://docs.aws.amazon.com/en/elasticbeanstalk/latest/api/Welcome.html
Having said that, I will cite a very useful scenario in several cases:
You create a beanstalk application from the console or cli and configure the integration with AWS CodeCommit. CodeCommit will prevent you from having to send the whole project to each deploy.
You create an instance of amazon to perform the implantation. This instance has a git repository of your project, it gets committed to the beanstalk environment settings (environment variables for example), and deploy to beanstalk using CodeCommit.
This scenario is very useful for a team project for beanstalk because you can use the deployment instance to hide sensitive details and configure deploy patterns.

AWS User data windows standard AMI

I'm trying to use codedeploy with autoscaling in order to automate the deployment of my application.
I have everything ready. When developing all the parts (hooks' scripts, roles etc) I installed the codedeploy agent manually. Now I want to make it production ready, which means that the codedeploy agent will be installed at sysprep (by providing the powershell commands via user data in launch configuration).
The problem is that it's not working. The script either runs and fails for some reason (are there any logs to confirm?) or it doesn't run at all. My AMI is based on a aws standard windows AMI. The EC2ConfigService is present.
Do you have any idea of what could be the problem or if I have some way to find what's the problem (logs)?
You could take a look at C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt
On Linux AMIs you can also find the user data script execution logs in the ec2 console when you right click your instance -> Instance Settings -> Get System Log.

best way to bundle update on server while booting

I have an AMI which has configured with production code setup.I am using Nginx + unicorn as server setup.
The problem I am facing is, whenever traffic goes up I need to boot the instance log in to instance and do a git pull,bundle update and also precompile the assets.Which is time consuming.So I want to avoid all this process.
Now I want to go with a script/process where I can automate whole deployment process, like git pull, bundle update and precompile as soon as I boot a new instance from this AMI.
Is there any best way process to get this done ? Any help would be appreciated.
You can place your code in /etc/rc.local (commands in this file will be executed when server will be loaded).
But the best way is using (capistrano). You need to add require "capistrano/bundler" to your deploy.rb file, and bundle update will be runned automatically. For more information you can read this article: https://semaphoreapp.com/blog/2013/11/26/capistrano-3-upgrade-guide.html
An alternative approach is to deploy your app to a separate EBS volume (you can still mount this inside /var/www/application or wherever it currently is)
After deploying you create an EBS snapshot of this volume. When you create a new instance, you tell ec2 to create a new volume for your instance from the snapshot, so the instance will start with the latest gems/code already installed (I find bundle install can take several minutes). All your startup script needs to do is to mount the volume (or if you have added it to the fstab when you make the ami then you don't even need to do that). I much prefer scaling operations like this to have no dependencies (eg what would you do if github or rubygems have an outage just when you need to deploy)
You can even take this a step further by using amazon's autoscaling service. In a nutshell you create a launch configuration where you specify the ami, instance type, volume snapshots etc. Then you control the group size either manually (through the web console or the api) according to a fixed schedule or based on cloudwatch metrics. Amazon will create or destroy instances as needed, using the information in your launch configuration.

AWS Ruby SDK - Delete application and all associated environments

I'm using the AWS Ruby SDK to interact with Amazon Beanstalk. I've got applications with more or more running environments. The application names are easily known to my Ruby code, but the environment names were dynamically generated, and so aren't easily obtainable.
I hoped that the delete_application method would also terminate all running environments automatically, but the following error results from trying to delete a Beanstalk application with running environments:
Unable to delete application dsw88-test-app-prod because it has a version that is deployed to a running environment.
Deleting an application manually in the AWS console also is able to automatically remove running environments. Is there a way to easily delete an application and all its running environments using the Ruby SDK?
After more research, I don't believe this is possible. Instead, you must use the following process:
Get a list of all the environments in your application using the describe_environments call
Terminate each one of those running environments using the terminate_environment call
Once those are done (You should wait for them to finish), then you can run the delete_application call to delete your application
It would be nice if Amazon provided a way to delete all that stuff programmatically with one command (like they do in the UI), but it doesn't look like that is currently supported.

How to actually configure debugging in CFBuilder

I have ColdFusion Builder 2.0.0 installed and I am trying to look at the much vaunted step debugging. However, I cannot seem to get it to work as I don't have my site / JRun install setup in the naive way the examples show.
I am using version 9,0,1,274733 of ColdFusion and my configuration is as follows:-
Installed as multi-server version with Jrun here:- c:\Apps\JRun4
application files are here:- d:\websites\my.website.com
web root is here d:\websites\my.website.com\www
core library of CFCs is here d:\websites\frameworks\core which is mapped in CF as core
I have read this watched this http://help.adobe.com/en_US/ColdFusionBuilder/Using/WS0ef8c004658c1089-31c11ef1121cdfd6aa0-7fff.html and this http://forta.com/blog/index.cfm/2007/5/30/CF8-Debugger-Getting-Started and watched this https://experts.adobeconnect.com/_a204547676/p33029638/?launcher=false&fcsContent=true&pbMode=normal but I get stuck at the point after you have configured RDS and you are setting up the server for your project.
Now I am pretty sure the above is correct, when I move to the next page in the wizard I get the following:-
Now I as I understand it my Server Home should be c:\Apps\JRun4 and my Document root should be d:\websites\my.website.com
This all looks like it is going to be fine until you actually try and debug when I get
followed by
I can confirm that the server is running and RDS is enabled as in the RDS Dataview I can see all my databases.
Any help would be gratefully received as this is very frustrating and the documentation is very lacking.
There is a video tutorial as well that you may want to check and see if that helps. http://blogs.adobe.com/anand/2011/01/learn-how-to-debug-coldfusion-applications-using-coldfusion-builder-2.html
You need to specify the RDS username/password and the "application server name". If you are using the base instance that was installed when you setup the multiserver install of CF that is "cfusion", otherwise its the name of the instance you are using.
The RDS username is most likely "admin" unless you setup custom users for RDS. The password is the RDS password you specified when you installed CF.

Resources