Deploy ASPNET Core lên Google Cloud Virtual Machine Instances

July 24, 2019
Categories:
Tags:

Giới thiệu

  • Mình đã có bài viết hướng dẫn deploy ASPNET Core lên Azure. Với mình thì deploy ASPNET Core lên Google Cloud dùng Virtual Machine (VM) thì nhiều bước và phức tạp hơn nhiều. Tại khách hàng muốn chứ mình cũng không thích kiểu này.
  • Mình dùng Mac để phát triển ứng dụng, nên cần kết nối remotely đến Window Server cũng như SQL Server bằng những app trên Mac
  • Nói chung mình lỡ viết rồi nên cũng ráng viết rất chi tiết, chụp hình từng bước, mình nghĩ nếu bạn chưa deploy ứng dụng lần nào cũng có thể làm được một cách dễ dàng.

Hy vọng bài viết này giúp ích được cho mọi người

Bước 1: Tạo Virtual Machine Instance 

Chọn OS Image

deploy ASP.NET Core 1

Ở đây mình chọn Microsoft Windows Server 2016 Datacenter. Nếu bạn chọn OS là Windows thì sẽ trả thêm phí bản quyền nhé

deploy ASP.NET Core 2

Ở phần Firewall, nhớ chọn Allow Http and Https nhé, không là không truy cập được

deploy ASP.NET Core

Xem giá tiền và xác nhận tạo VM

deploy ASP.NET Core 5

Bước 2: Config Local Server và IIS

Config Local Server

Vì mình dùng Mac, nên mình dùng app Microsoft Remote Desktop để kết nối với Windows Server vừa mới tạo. App này free và khá tốt. Mình tạo 1 folder share giữa máy Mac local và server luôn để lát nữa share file cho tiện.

deploy ASP.NET Core 6

Tiếp theo bạn truy cập remote vào server mới tạo. Mở Server Manager và tắt cái Internet Explorer (IE) Enhanced Security Configuration đi để vào IE tải file được.

Sau đó cài đặt the .NET Core Hosting Bundle, lựa version ASP.NET Core của bạn để cài vào máy ở đây

Config IIS

Từ Server Manager, chọn Manage -> Add Roles and Features

deploy ASP.NET Core 7

Popup hiện ra, bạn bấm Next vài lần. Ở Tab Server Roles, chọn thêm Web Server (IIS). Ở tab Features, chọn thêm .NET Framework 4.6 Features.

deploy ASP.NET Core 8

deploy ASP.NET Core 9

Bước 3: Cài đặt, config SQL Server

Thường những bài hướng dẫn trên mạng bỏ qua bước này, nhưng mình thấy đây là bước cần thiết nhất vì app nào cũng có database mà. Vì mình phát triển ứng dụng trên Macbook, nên cần kết nối tới database trên Windows Server (Virtual Machine mới tạo ở trên).

Cài đặt SQL server

Mình dùng bản free là SQL Express 2017. Quá trình cài đặt cũng đơn giản.

deploy ASP.NET Core 10

Bạn cài thêm SQL Server Management Studio thêm cho dễ config.

Config SQL Sever

Bạn dùng SQL Server Management Studio để login vào SQL Server và tạo database. Thường thì server name sẽ là: localhost hoặc localhost\SQLEXPRESS. Ví dụ của mình default là INSTANCE-1\khoanguyenvan1505. Sau khi bạn connect thành công, nháy phải vào connection đó chọn Properties.

deploy ASP.NET Core 11

Qua tab Security, chọn mode Windows Authentication

deploy ASP.NET Core 12

Tab Connection, chọn Allow connections to this server

deploy ASP.NET Core 13

Vào folder Security để tạo account, đây là account để bạn dùng truy cập vào SQL Server remote.

Sau đó vào grant access cho user này

Truy cập SQL Server bằng IP address

Giờ chúng ta cần config để cho phép máy local có thể truy cập được SQL Server qua địa chỉ IP.

Bạn mở SQL Server Configuration Manager, và Enable 3 cột như trong hình.

Double click vào TCP/IP, tab IP Adress. TCP Dynamic Ports để trống, TCP Port: 1433

Tiếp theo ta sẽ khai báo port 1433 trong FireWall. Bạn mở app Windows Firewall with Advanced Security. Chọn Tab Inbound Rules, chọn New Rules.

Tạo rule mới là TCP:1433 nhé.

Sau đó bạn vào SQL Server Management Studio và login với name server là IP address của Virtual Machine nhé. Nếu thành công thì sang bước tiếp theo, còn nếu báo lỗi thì bạn search access sql server via ip address. Mình thấy khá nhiều lỗi linh tinh về vấn đề này.

Mở port Firewall trên Google Cloud

Bước này sẽ cho phép từ 1 địa chỉ IP từ máy khác có thể truy cập được SQL Server. Bạn vào phần Firewall Rules trên Google Cloud và thêm 1 rule giống hình nhé.

Chú ý: Bạn cần vào lại VM instance của mình xem Network tags của nó là gì thì trong cái rule phải dùng Network tags đó mới đúng nhé. Bạn dùng Apply to all sẽ không được đâu, mình mất cả mấy tiếng vì cái targets này luôn ý. Cứ tưởng Apply to all sẽ có tags của VM, nhưng không phải bạn à.

Bạn vào máy local kết nối thử được chưa nhé:

Nếu mọi thứ ok hết thì tạo 1 database để cho bước sau nhé.

Bước 4: Chuẩn bị app ASP.NET Core

Mình tạo 1 app đơn giản có đăng ký đăng nhập để kết nối với database.

dotnet new mvc --auth Individual -o deploy

Bạn vào đổi connection string lại:

"Server=tcp:{your_vm_ip_address},1433;Initial Catalog={db_name};Persist Security Info=False;User ID={your_id};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"

Sau đó bạn thực hiện migration để update db

dotnet ef migrations add initDb dotnet ef database update

Nếu không được có thể bỏ Encrypt=True trong connection string thử. Bạn chạy thử ok rồi thì:

dotnet publish -c Release

Sau đó copy Folder publish sang Google VM đã tạo ở bước 1. Bạn có thể upload lên đâu đó rồi vào VM tải về, hoặc dùng share folder như mình ở bước 2 ở trên.

Sau đó copy tất cả trong folder publish vào

C:\inetpub\wwwroot\nivikademy

Trong đó thì nivikademy là để folder mình muốn chứa app này, bạn đặt tên khác cũng được nhé

Bước 5: Thêm site trong IIS

Bạn mở app IIS lên nhé

Dưới tab Sites, bạn chọn Add Websites. Bạn chọn đường dẫn đến thư mục ở trên, mình dùng port 5000.

Bạn vào Application Pools, double click vào site mới tạo. Ở phần .NET CLR version, chọn No Managed Code.

Sau đó bạn vào http://localhost:5000/ và thấy website thì ok. Tuy nhiên nếu bạn truy cập bằng {VM_IP_Address}:5000 thì vẫn chưa được. Tiếp theo mình sẽ hướng dẫn bạn dùng custom domain với Google Cloud

Bước 6: Dùng domain với Google Cloud

Bạn vào Network Services => Cloud DNS, sau đó tạo 1 Zone mới.

Trong chi tiết Zone Detail, bạn có thể config như mình. Sau đó lưu phần thông tin name server (khung màu đỏ) và vào phần quản lý domain của bạn trỏ domain về name server này.

Sau đó bạn cần quay lại VM để redirect từ domain của bạn sang localhost:5000. Bạn cần edit binding lại. Chọn website, nháy phải chuột, chọn Edit Binding

deploy ASP.NET Core lên Google Cloud editing binding

Sau đó thêm mới 1 binding

Như hình thì mình đang map nivikademy.com tới localhost của VM. Mà site nivikademy hiện tại đang dùng port 5000 của localhost.

Vì thế khi truy cập nivikademy.com sẽ vào được localhost:5000. Bạn có thể binding thêm www.domain nếu cần.

Phù, như vậy là đã xong rồi đó.

Kết

Hy vọng với bài viết này, bạn có thể deploy ASPNET Core lên Google Cloud dùng Virtual Machine thành công. Bạn dùng bài viết này để tham khảo deploy ASPNET Core lên VPS Windows cũng được (bỏ mấy cái config của Google Cloud đi thôi)

Thực ra Google Cloud Platform hỗ trợ nhiều thứ hơn cho ASP.NET Core như Cloud Tools for Visual Studio extension, App Engine, Container Engine, Deploy a Framework Dependent Deployment bundle, vv

Nhưng theo mình thấy dùng VM là phức tạp nhất rồi. Nên nếu bạn deploy lên VM thì mấy tool khác khá dễ. Nếu bạn gặp khó khăn gì bạn cứ comment nhé. Chúc bạn thành công.

Author: Khoa Nguyen
https://niviki.com
Thất nghiệp. Đang rủ rê nhiều người thất nghiệp. Nhận làm ứng dụng MVP để nhiều người bỏ việc. Hy vọng với NIVIKI.COM có thể lan toả tinh thần thất nghiệp đến với nhiều người hơn nữa.