当前位置 : 首页 » 文章分类 :  开发  »  AWS-EC2使用记录

AWS-EC2使用记录

aws ec2免费版使用笔记


AWS EC2设置时区

默认情况下,Amazon Linux 实例设置为 UTC (协调世界时) 时区,但是您可能想将实例上的时间更改为本地时间或网络中的其他时区。

重要:这些过程适用于 Amazon Linux。有关其他发布版本的更多信息,请参阅其具体文档。

更改实例上的时区

1、确定将在实例上使用的时区。/usr/share/zoneinfo 目录包含时区数据文件的层次结构。浏览该位置的目录结构,查找针对您的时区的文件。

[ec2-user ~]$ ls /usr/share/zoneinfo
Africa      Chile    GB         Indian       Mideast   posixrules  US
America     CST6CDT  GB-Eire    Iran         MST       PRC         UTC
Antarctica  Cuba     GMT        iso3166.tab  MST7MDT   PST8PDT     WET
Arctic      EET      GMT0       Israel       Navajo    right       W-SU
...

该位置的部分条目是目录 (如 America),这些目录包含针对特定城市的时区文件。查找要用于实例的城市 (或时区中的一个城市)。
在此示例中,您可以使用上海的时区文件 /usr/share/zoneinfo/Asia/Shanghai

2、使用新时区更新 /etc/sysconfig/clock 文件。
(1)使用您常用的文本编辑器(如 vim 或 nano)打开 /etc/sysconfig/clock 文件。您需要在编辑器命令中使用 sudo,因为 /etc/sysconfig/clock 归 root 所有。
(2)查找 ZONE 条目,将其更改为时区文件 (忽略路径的 /usr/share/zoneinfo 部分)。例如,要更改为上海时区,请将 ZONE 条目更改为以下内容:

ZONE="Asia/Shanghai"

注意: 请勿将 UTC=true 条目更改为其他值。此条目用于硬件时钟;如果您在实例上设置了其他时区,则无需调整此条目。
(3)保存文件,退出文本编辑器。

3、在 /etc/localtime 与时区文件之间创建一个符号链接,以便实例在引用本地时间信息时找到此时区文件。

[ec2-user ~]$ sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4、重启系统,以便所有服务和应用程序接受新时区信息。

[ec2-user ~]$ sudo reboot

在 Amazon Linux 上更改时区
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/set-time.html


AWS EC2 型号及价格

型号 vCPU ECU 内存 (GiB) 实例存储 (GB) Linux/UNIX 使用量
c4.xlarge 4 16 7.5 GiB 仅限 EBS 每小时 0.199 USD
c4.2xlarge 8 31 15 GiB 仅限 EBS 每小时 0.398 USD
m4.xlarge 4 13 16 GiB 仅限 EBS 每小时 0.20 USD
m4.2xlarge 8 26 32 GiB 仅限 EBS 每小时 0.40 USD

底层微服务 prod 生产环境一般用 c4.2xlarge ,有些并发量小的用 c4.xlarge
部分后台服务 prod 生产环境使用 m4.xlarge
staging预生产环境一般使用 c4.xlarge ,部分底层服务例如user用户服务staging环境也用的 c4.2xlarge

Amazon EC2 定价
https://aws.amazon.com/cn/ec2/pricing/on-demand/

Amazon EC2 实例类型
https://aws.amazon.com/cn/ec2/instance-types/


实例配置

启动实例

启动免费ec2实例,我选择的是第一个 Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-6cd6f714
启动后记下 实例 ID,公有 DNS (IPv4),IPv4 公有 IP,以后连接时用。

Linux版本

Amazon Linux 2 AMI ,从/etc/os-release可以看到是类 RHEL/CentOS 发行版,Amazon Linux 2 是 CentOS 7.x

$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

uname 信息如下:

uname -a
Linux ip-xx-xx-xx-xx.us-west-2.compute.internal 4.14.62-70.117.amzn2.x86_64 #1 SMP Fri Aug 10 20:14:53 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

密钥对

启动实例时,会让添加一个密钥对,可以直接让系统新生成,然后提示下载一个.pem文件,这个就是自己的私钥。
把私钥放到一个安全的目录,一般是 ~/.ssh/,然后将私钥的权限改小才能使用,

管理多个密钥对

如果想从多台机器登陆ec2,比如Windows和mac,需要生成多个密钥对。
在ec2控制台左侧选择“密钥对”->“创建密钥对”,输入名称就会创建一个密钥对,同时会下载.pem私钥文件。

但我使用新创建的密钥对在另外一台电脑上登录时,提示:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

后来又试了 在本地 ssh-keygen生成密钥对,把公钥上传到 aws页面上,登录时还是提示这个错误。

最后只能把第一次生成的 .pem 私钥拷贝到另一台电脑上,登录成功了。
懂ssh原理的话就知道,其实只要把新电脑的公钥贴到~/.ssh/authorized_keys中即可

.pem私钥权限过大无法登陆

确保 .pem 文件具有权限 0400 而不是 0777。
否则登录时提示:
错误:未保护的私钥文件

在mac使用时,0644的权限都不行:

xxxxx  ~/.ssh  ssh aws
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/xxx/.ssh/xxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxxx/.ssh/xxxx.pem": bad permissions
ec2-user@ec2-xxxxxx.us-west-2.compute.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

必须保护您的私钥文件,防止其他任何用户对其进行读写操作。如果除您外其他任何人都能够读取或写入您的私钥,则 SSH 会忽略您的密钥
获取您在启动实例时指定的密钥对的 .pem 文件在您电脑上位置的完全限定路径。确保 .pem 文件具有权限 0400 而不是 0777。
chmod 0400 .ssh/my_private_key.pem 改小私钥文件的权限

用户名

对于 Amazon Linux 2 或 Amazon Linux AMI,用户名称是 ec2-user

ssh密钥登录

ssh -i myprivate.pem ec2-user@ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

或者在~/.ssh/config中增加配置如下,以后直接使用ssh aws即可登录

Host aws
    HostName ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
    IdentityFile ~/.ssh/myprivate.pem
    User ec2-user

使用 SSH 连接到 Linux 实例
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html

scp上传文件到服务器

scp -i ~/.ssh/myprivate.pem filename ec2-user@ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:~


ec2安全组(访问控制)

EC2防火墙默认阻断了除ssh 22端口外的所有入站流量
安全组主要是做访问控制的,比如ip白名单、黑名单、开发哪些端口等等。
可以编辑EC2的Scurity Groups安全组配置,根据自己需要开放入站端口

编辑aws ec2的安全组,开放tcp的80端口给nginx用,3306给mysql用,8080端口给Tomcat用,8001-8008端口预留给其他服务用。
一般来说,web服务都可以通过nginx进行转发,可以只暴露80端口,不过为了方便测试,也暴露了一些其他端口。

端口使用情况汇总:
80: nginx监听端口
3306: mysql连接端口
8001: springboot测试服务


ec2安全组配置

注意:
1、描述必须全部是英文字符,否则无法保存。
2、类型中已经预定义了好多常用协议,直接选择即可,如果没有合适的,选择 自定义TCP规则 可满足大多数情况。


软件安装

yum安装lrzsz

$ yum list lrzsz
已加载插件:extras_suggestions, langpacks, priorities, update-motd
24 packages excluded due to repository priority protections
可安装的软件包
lrzsz.x86_64    0.12.20-36.amzn2.0.2      amzn2-core

使用yum安装lrzsz:
sudo yum -y install lrzsz


yum安装java8

检索包含java的列表
yum list java*
可以看到在 aws的默认库 amzn2-core 中已有java

检索1.8的列表
yum list java-1.8*

安装1.8.0的所有文件(必须使用root用户)
sudo yum -y install java-1.8.0-openjdk*

测试java运行环境
java -version

查看安装目录,先看看java命令的目录:

[ec2-user@ip- usr]$ which java
/usr/bin/java
[ec2-user@ip- usr]$ ll -h /usr/bin/java
lrwxrwxrwx 1 root root 22 Sep 16 06:13 /usr/bin/java -> /etc/alternatives/java

可知安装到了 /etc/alternatives/ 中


yum安装git

sudo yum install git

git 需要依赖 curl,zlib,openssl,expat,libiconv 等库,会自动安装这些依赖。


yum安装nginx

添加nginx yum源:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装nginx:

sudo yum install nginx

安装后配置文件位置 /usr/local/nginx/conf/nginx.conf

查看nginx安装路径:

$ rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.14.2
/usr/share/doc/nginx-1.14.2/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx

nginx配置文件 nginx.conf

# work进程的用户
user ec2-user ec2-user;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    map $http_origin $corsHost {
        default 0;
        "~http://madaimeng.com" http://madaimeng.com;
        "~http://devgou.com" http://devgou.com;
        "~http://masikkk.com" http://masikkk.com;
        "~http://localhost:4000" http://localhost:4000;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    server {
        listen       80;
        server_name  api.masikkk.com api.madaimeng.com api.devgou.com;

        location / {
                proxy_pass http://localhost:8001;
                add_header 'Access-Control-Allow-Origin' $corsHost;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    server {
        listen       80;
        server_name  devgou.com www.devgou.com;

        location / {
                  root   /home/ec2-user/git/madaimeng;
                index  index.html;
        }
    }

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

yum安装nodejs和npm

Installing Node.js via package manager
https://nodejs.org/en/download/package-manager/

NodeSource Node.js Binary Distributions
https://github.com/nodesource/distributions/blob/master/README.md

使用官方脚本添加NodeSource源

nodejs官方制作了添加node源的在线脚本,直接下载执行就行,不需要再手动添加 epel 和 remi 源了

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -

安装过程的输出信息如下:

sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -

## Installing the NodeSource Node.js 8.x LTS Carbon repo...


## Inspecting system...

+ rpm -q --whatprovides redhat-release || rpm -q --whatprovides centos-release || rpm -q --whatprovides cloudlinux-release || rpm -q --whatprovides sl-release
+ uname -m

## Confirming "el7-x86_64" is supported...

+ curl -sLf -o /dev/null 'https://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm'

## Downloading release setup RPM...

+ mktemp
+ curl -sL -o '/tmp/tmp.frFXm7r4k8' 'https://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm'

## Installing release setup RPM...

+ rpm -i --nosignature --force '/tmp/tmp.frFXm7r4k8'

## Cleaning up...

+ rm -f '/tmp/tmp.frFXm7r4k8'

## Checking for existing installations...

+ rpm -qa 'node|npm' | grep -v nodesource

## Run `sudo yum install -y nodejs` to install Node.js 8.x LTS Carbon and npm.
## You may also need development tools to build native addons:
     sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
     curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
     sudo yum install yarn

安装nodejs

按照安装NodeSource源时输出信息的提示,使用yum来安装nodejs

sudo yum install -y nodejs

安装nodejs时自动会安装npm工具,完成后查看版本验证安装成功:

node -v
v8.15.0
npm -v
6.4.1

yum安装nodejs
https://www.jianshu.com/p/695d9cafcd4e


AWS EC2 自己安装mysql及远程访问

安装mysql

和普通linux下安装mysql大致相同,看mysql官网的文档即可。
或参考笔记 MySQL-Linux安装
root/123456

Getting Started with MySQL - Installing and Starting MySQL
https://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-installing

创建可远程访问的mysql账号

创建一个账号,Host为%,即允许所有主机连接,并给账号授权。
然后在ec2命令行中验证可以本地登录mysql

配置mysql绑定ip

查看mysql server绑定ip
show variables like 'bind_address';
默认是*,表示接收所有的IPv4 或 IPv6 连接请求,如没有更改过就不用配置。

编辑EC2安全组配置,放开3306端口入站流量

mysql安装后还不能远程连接,因为EC2防火墙默认阻断了除ssh 22端口外的所有入站流量
编辑EC2的Scurity Groups安全组配置,添加允许所有来源的3306端口入站流量

EC2开启MySql远程访问
https://blog.csdn.net/timberwolf_2012/article/details/47350215

远程连接mysql数据库

之后便可利用aws提供的域名远程连接mysql访问
可以在Windows或Mac命令行中登录,也可以使用Navicat或DataGrip等图形界面登录

C:\Users\xxx> mysql -u username -h ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com -p
Enter password: *******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 5.6.41 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

通过自定义域名远程连接MySQL数据库

EC2 给我们提供了公网IP和域名,可以在自己的DNS提供商处配置自定义域名解析到这个公网IP,这样就可以使用域名远程连接了。
比如在阿里云上,我有个域名 devgou.com, 新加个二级域名: mysql.devgou.com 解析到EC2提供的域名,然后就可以使用域名访问了。
mysql -u usrname -h mysql.devgou.com -ppasword
注意解析到 IPv4 地址要选择A记录,解析到域名要选CNAME记录。


AWS EC2部署Spring Boot应用及自定义域名访问

后台启动spring boot应用及本地访问

启动应用的脚本:start.sh

#!/bin/bash
nohup java -jar yourapp.jar --server.port=8001 &

或者直接在命令启动:

sudo nohup java -jar blog-0.0.1-SNAPSHOT.jar --server.port=8001 &

注意必须sudo以root权限,否则报错无法启动:

默认以8080端口启动,可以自己指定端口,我这里用的8001。
用80启动后,就可以直接用域名,不用加端口访问了,因为http默认使用80端口

启动后可以在aws本地尝试用localhost访问,以及用aws给分配的公有DNS访问。
当然Spring boot中先要有处理/请求的Controller代码,可以先简单的返回个hello world

如果以8080端口启动:

curl localhost:8080/
curl ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:8080/

如果以80端口启动:

curl localhost/
curl ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com/

springboot 后台运行
https://www.cnblogs.com/bigben0123/p/7910036.html


配置nginx请求转发

监听我三个域名各自的api子域名,转发到localhost:8001,也就是springboot监听的端口:

server {
    listen       80;
    server_name  api.masikkk.com api.madaimeng.com api.devgou.com;

    location / {
            proxy_pass http://localhost:8001;
    }
}

ec2安全组放开80端口入站流量

编辑ec2安全组,放开nginx监听的80端口的入栈流量。


自定义域名解析到aws

目前我的域名都放在阿里云,这里以阿里云中的域名 devgou.com 解析为例。


域名解析到EC2

CNAME表示解析到一个域名,而不是一个ipv4地址
www表示解析 www.example.com 的访问
@表示解析 example.com 的访问
主机记录api,也就是我们新定义了一个子域名 api.devgou.com

另外,在另外两个域名上也都加上 api子域名到aws的解析。

以后,我用自己3个域名的api子域名都可以访问springboot接口了:
http://api.devgou.com/
http://api.masikkk.com/
http://api.madaimeng.com/
同时,也不影响原本博客的访问。


上一篇 博客项目方案

下一篇 VSCode使用笔记

阅读
评论
4k
阅读预计18分钟
创建日期 2018-09-04
修改日期 2019-03-10
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论