I would like to run a .NET Core MVC website from an AWS Amazon Linux AMI instance.
Here are the steps I have taken so far:
sudo yum update -y
sudo yum install libunwind -y
sudo yum install gettext -y
curl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
curl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
sudo ln -s ~/dotnet/dotnet /usr/local/bin
curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
source /home/ec2-user/.dnx/dnvm/dnvm.sh
dnvm upgrade -r coreclr
sudo yum install automake libtool wget -y wget http://dist.libuv.org/dist/v1.8.0/libuv-v1.8.0.tar.gz tar -zxf libuv-v1.8.0.tar.gz cd libuv-v1.8.0 sudo sh autogen.sh sudo ./configure sudo make sudo make check sudo make install sudo ln -s /usr/lib64/libdl.so.2 /usr/lib64/libdl sudo ln -s /usr/local/lib/libuv.so.1.0.0 /usr/lib64/libuv.so
sudo yum install git -y
mkdir director-name cd directory-name
git config user.name "myUserName" git config user.email "myEmail" git clone https://github.com/username/repositoryname.git
cd solution-name/src/web-project-name
. dotnet restore
dotnet build
dotnet run
At this point I see the following in the terminal:
Now listening on: http ://localhost:5000
I attempt to hit the AWS DNS/IP with port 5000 tagged at the end (http ://aws-ip-or-dns:5000), but get no response.
I know that Docker and Mono are tools that I can use, but I would rather get this approach to work.
The scripts I used to install .NET Core, DNVM, and DNX are some combination of the CentOS and Ubuntu directions from these links:
Disclaimer I am not that experienced with Linux. It is fair to say I don't understand some of the commands that I'm running. But, I'm here to learn!
Question: What do I need to do to get a template .NET Core web application running an an AWS Amazon Linux environment?
(My guess is I have something missing with setting up the HTTP server)
I need more reputation to post more than two links, so if someone wants to EDIT, I'd appreciate it.
The answer from @user326608 almost gets it there, but I'm going to add the steps I am using now after the release of .NET Core 1.0.0.
sudo yum update -y
sudo yum install libunwind -y
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
sudo yum install git -y
git config --global user.name "myUserName"
git config --global user.email "myGitEmail@something.com"
mkdir /var/coreapp
cd /var/coreapp
git clone https://github.com/myUsername/myRepository.git
sudo chown -R ec2-user /var/coreapp
cd /var/coreapp/solution-name/src/web-project-name
dotnet restore
, build dotnet build
, and run in background nohup dotnet run > /dev/null 2>&1 &
This solution is working well for me now. I have a related post trying to create a User Data bootstrap script to try and make this even easier.
For anyone needing to update the above for the Microsoft.NETCore.App 1.0.1 September 2016 update, the https://www.microsoft.com/net/core#centos instructions worked for me:
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=827529
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo rm /usr/local/bin/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
Subsequently running dotnet --info
gives:
.NET Command Line Tools (1.0.0-preview2-003131)
Product Information:
Version: 1.0.0-preview2-003131
Commit SHA-1 hash: 635cf40e58
Runtime Environment:
OS Name: amzn
OS Version: 2016.09
OS Platform: Linux
RID: amzn.2016.09-x64
After that I deleted my project.lock.json
and ran a dotnet restore
.
I couldn't get a dotnet run
to work directly as my RID wasn't known, but using a Dockerfile
with microsoft/dotnet:onbuild
and this section in my project.json
worked:
"runtimes": {
"debian.8-x64" : {}
},
If you are running your AWS instance in VPC mode and you don't have security group that says that it's inbound rule has "All Traffic" and Source is "Anywhere" or if it says that "Custom TCP rule", Port is 5000 and Source is "Anywhere" then it will not allow you to connect to that port. In VPC mode all incoming ports are closed by default and you should allow them explicitly with some predefined or your own security groups.
If you use Opswork (or Chef) you can use the following Chef recipe https://supermarket.chef.io/cookbooks/dotnetcore to install a dotnet core on AWS Linux, assumption are that you have uploaded the a zipped file using dotnet publish file to a S3 bucket.
The layer json has JSON that has the app short name eg
{
myapp {}
}
# The recipe to install
# 1) Figure which App needs to be installed using JSON in Opsworks layer
# 2) Get the Zip file from S3 and Unzip into /usr/bin/myapp/publish
# 3) Create bash file to start
# 4) Start the app
apps = search(:aws_opsworks_app)
apps.sort_by { |v| v["shortname"] }.each do |app|
appname = app["shortname"]
app_source = app["app_source"]
bucket, remote_path = OpsWorks::SCM::S3.parse_uri("#{app_source['url']}")
filename = remote_path.split("/")[-1]
extn = File.extname filename
if (!node["#{appname}"].nil? && extn == '.zip')
apppath = "/usr/bin/#{appname}"
dotnetapp = app["environment"]["dotnetapp"]
aspnetcore_environment = app["environment"]["aspnetcore_environment"]
Chef::Log.info("App dotnet Name:#{app[:environment][:dotnetapp]}")
Chef::Log.info("Enviroment:#{aspnetcore_environment}")
app_checkout = ::File.join(Chef::Config["file_cache_path"], app["shortname"])
package = "#{app_checkout}/#{filename}"
# Use https://github.com/awslabs/opsworks-windows-demo-cookbooks or any s3_file recipe to download the zip file
# if you copy the opsworks-windows-cookbooks you will to modify the recipe a little to work on aws linux
opsworks_scm_checkout app["shortname"] do
destination app_checkout
repository app_source["url"]
user app_source["user"]
password app_source["password"]
type app_source["type"]
ssh_key app_source["ssh_key"]
revision app_source["revision"]
end
directory "#{apppath}" do
end
execute 'unzip package' do
command "unzip -o #{app_checkout}/#{filename} -d #{apppath}"
end
# create a sysvint sh file to manage dotnet service
initd_directory = "/etc/init.d"
intd_file = File.join(initd_directory, app["shortname"])
template intd_file do
mode "744"
source 'file.sh.erb'
variables(
:service_name => app["shortname"],
:dotnetapp => "#{dotnetapp}",
:apppath => "#{apppath}/publish"
)
end
execute "start service #{dotnetapp}" do
command ".#{initd_directory}/#{appname} start"
environment ({"ASPNETCORE_ENVIRONMENT" => "#{aspnetcore_environment}"})
end
Chef::Log.info("End Install #{appname}")
end
end
# The ERB Template:
#!/bin/bash
#
# description: <%= @service_name %>
#
# Get function from functions library
. /etc/init.d/functions
#
# Start the service <%= @service_name %>
#
start() {
initlog -c "echo -n Starting dotnet <%= @service_name %> server: "
cd <%= @apppath %>
nohup dotnet <%= @dotnetapp %> /dev/null 2>&1 &
### Create the lock file ###
touch /var/lock/subsys/<%= @service_name %>
success $"<%= @service_name %> server startup"
echo
}
# Restart the service <%= @service_name %>
stop() {
initlog -c "echo -n Stopping dotnet <%= @service_name %> server: "
killproc dotnet
### Now, delete the lock file ###
rm -f /var/lock/subsys/<%= @service_name %>
echo
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status dotnet
;;
restart|reload|condrestart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit 0
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.