solomonxie / blog-in-the-issues

A personalised tech-blog, notebook, diary, presentation and introduction.
https://solomonxie.github.io
68 stars 12 forks source link

AWS为首的云服务器实战钻研 #31

Open solomonxie opened 6 years ago

solomonxie commented 6 years ago

Amazon Web Services是个真心强大靠谱的真·云服务器。只是玩好了它都可以被人敬仰,可是却真的不很容易配置,服务也太多。所以在这里开一篇,以供随时记录解决方案和发掘过程。 另外,附带性的会有一些DigitalOcean等的其它服务商方案。

涉及问题

solomonxie commented 6 years ago

❖ EC2的傻瓜式初始配置方案

AWS 的服务海洋里面,EC2是最常见最常用的一个。也就是平时我们租用云端服务器最常用的虚拟主机,可以让你把网站代码、数据库等等全都部署在上面,然后用户直接连接这个虚拟主机。相对于其它aws的邮箱、数据库、语音等云服务来说,EC2是一个大杂烩,也是个通用平台,做什么都行,看自己。

  1. 登录AWS控制后台,在服务列表中选择EC2 -> 左侧菜单Instances -> Launch Instance
  2. 选择合适的映像,推荐社区版的映像: 社区版有更多Linux发行版,在这里推荐选择ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20160114.5 ebs hvm
  3. 选t2.micro类型的instance,其中会清晰标记这个是免费的
  4. 设置详细:全部保持默认就行了
  5. 添加存储盘:免费的是20G以内,一般默认的8G足够用
  6. Tag可加可不加
  7. 安全组:根据需求后期可改,内容较多
  8. 综览及确认
  9. 选择密钥 必须要有,创建新的或选择已有的。 如果这里没创建,则以后ssh登录不了。
  10. 用SSH登录
    • 用Linux Shell的SSH命令登录: ssh -i "私有密钥文件路径.pem" 用户名@实例的公网IP 其中.pem文件是私有密钥,输入路径即可; 如果是ubuntu的映像,默认用户名是ubuntu, 如果是AWS定制的映像,默认用户名是ec2-user;
    • 用Windows的Putty软件登陆: 需要先用puttygen.exe把.pem私钥文件转换为.ppk文件, 然后在菜单connection -> SSH -> Auth中,把文件路径填上, 然后回到主菜单点击连接即可。
solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago

AWS Lightsail 无法ping通

ping某一个服务器,是需要服务器防火墙允许ICMP协议的数据包的。经查阅,AWS的所有服务是默认关闭icmp的。

除独立的Lightsail外,其它AWS服务都可以在安全组中设置防火墙开启icmp。 然而Lightsail的防火墙设置页面,并没有icmp选项,官方也没有任何相关解决方案。

更新

然而发现Lightsail可以在管理后台设置开放端口,如果ping指定的端口,那么还是可以ping通的。如:

ping 192.168.1.123:8888
solomonxie commented 6 years ago

搭建的SS服务开始几天很快然后就经常掉线,速度也变慢

不管是在DigitalOcean还是AWS的Lightsail搭建ss服务,都有这个问题。 都是出现在我将ip绑定到阿里云的域名之后,在想是不是和阿里云的域名有关系。出现掉线的情况后,无论是ip直连还是用域名连,情况都没有改善,所以怀疑是不是只要在阿里云绑定了域名和ip,就会被更严格的监控到使用ss服务,导致经常掉线。

更新

经过数个月使用发现: 即使不关联任何域名,也会每隔几天掉次线(可能是GFW的随机挂断?) 不过,如果过分暴露服务器(如开放80等常用端口作为Webdav、SMB等服务),好像会更频繁的掉线。

建议在AWS服务器挂固定公网IP,这样的话即使被屏蔽,也能瞬间取消挂载固定IP,恢复正常使用。

每次掉线,建议通过SSH连接,重启SS服务,或者直接重启机器。如果连SSH都连不上,那是真的比较麻烦。需要在AWS后台管理网页点reboot重启。 如果不翻墙无法访问AWS网页的话,那么就到Github上下载个Lantern,用它免费翻个墙登录AWS重启服务器。

solomonxie commented 6 years ago

AWS各国节点测试

根据CloudPing的测试,得出如下结果: image 除了加拿大没试过外,其它亲测完全属实,新加坡远快于日本和韩国。

solomonxie commented 6 years ago
solomonxie commented 6 years ago

各服务商的各国节点测试(不定期更新)

自从今天发现命令行里可以运行ookla的speedtest,就赶快到自己的树莓派、国外租的主机查看连接网速。之前一直用shadowsocks觉得网速慢的时候,总是怀疑有可能节点没选好,一会儿东京,一会儿新加坡,一会儿加拿大,可还是有问题。

AWS Lightsail 主机 -- Singapore 节点

下载速度近500M/s,上传速度150M/s,这是什么级别?! snip20180209_70

在网上看到过一个帖子说得很对,不管怎么测试,还有什么比Youtube 1080P更有说服力呢?

看到这个,才明白原来服务器本地访问的速度和上传的速度再快,也敌不过传输过程中的丢失。。 另外,我是在本机连接服务器访问youtube的,我本机的测速是15M/s,宽带的带宽是100M。 image 此时我本机访问bilibili视频的速度比访问youtube快了一倍,如下: image

solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago

利用VNC连接远程服务器桌面:使用xfce桌面

实际上可以在服务器上安装桌面,然后用VNC服务从Linux、Mac和Windows等各种地方连接远程桌面。 参考DigitalOcean的这篇攻略。

这里选择的是xfce桌面,非常轻量化,和vnc的配合也很融洽。

  1. 第一步:安装 -> 桌面和vnc服务

    sudo apt-get update
    sudo apt install xfce4 xfce4-goodies tightvncserver
  2. 第二步:配置桌面环境

  3. 第三步:启动VNC服务

    $ vncserver

    第一次启动时,会提示你创建一个登录密码和只供浏览用的登录密码。 image

  4. 第四步:开启服务器端口 服务器端口开放需要在供应商的网页控制面板里调整,各不相同。 因为vnc使用的是从5900端口开始,第1个桌面为5901,第2个为5902以此类推。所以就索性设置为5900-5999之间的端口都开放。 下面的是Lightsail的配置: image

  5. 第五步:从本地计算机利用vnc访问 每种平台方式不同。Mac上直接在文件夹菜单里的Connect to Server就可以连上,地址格式是:vnc://USER:IP:5901

引用DigitalOcean的说明:

A local computer with a VNC client installed that supports VNC connections over SSH tunnels. If you are using Windows, you could use TightVNC, RealVNC, or UltraVNC. Mac OS X users can use the built-in Screen Sharing program, or can use a cross-platform app like RealVNC. Linux users can choose from many options: vinagre, krdc, RealVNC, TightVNC, and more.

连接成功: image

solomonxie commented 6 years ago

服务器安装「gnome」桌面供vnc远程访问

上面写了xfce桌面,不过样子比较丑,所以想试一试Ubuntu的gnome桌面。 参考阿里云官方参考文章。

solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago
solomonxie commented 6 years ago

❖ 「AWS Lightsails」 Server Overview

Official: AWS Lightsail.

「OS」Choices

「REGIONS」

image

「PRICING」

Linux: $3.5 USD/mo (Lowest) Windows: $8.0 USD/mo (Lowest)

「STATIC IP」

They're free in Lightsail, but it will be charged $0.005 USD/hour for static IPs not attached to an instance for more than 1 hour, which means it will cost 3.6 USD/mo !! That's insane

「SNAPSHOT」

Refer: What do Lightsail snapshots cost?

$1.00 USD/20GB-mo (Lowest) $0.05 USD/GB-mo.

Snapshot of an instance, CANNOT cross region, but can change zone in the same region.

You can both create a Snapshot from an instance, or create an instance from a snapshot.

Refer to: Create a Linux/Unix-based instance from a snapshot in Lightsail

「BLOCK STORAGE」

Block storage disks can only be attached to instances in the same region and zone.

$0.10 USD/GB-mo. $2.00 USD/20GB-mo.

image

Scalable

Scale up or down within minutes with disks of up to 49TB– and attach up to 15 disks per instance.

Disk limits:

Block storage disks can only be attached to instances in the same region and zone. The new disk must be the same size or larger than: 8 GB. You can create additional storage disks with a capacity of up to 16 TB (16,384 GB). Your total disk storage must not exceed 20 TB in a single AWS account. You can attach up to 15 disks to a single Lightsail instance, in addition to the system disk. You can only attach a block storage disk to one Lightsail instance.

「LOAD BALANCER」

$18 USD/mo.

solomonxie commented 6 years ago

❖ 「DigitalOcean Droplet」 Server Overview

Official: Digital Ocean

「OS」 Choices

image

「REGIONS」

image

「PRICING」

image

「FLOATING IP」 (Static ip)

Floating IPs are free to use, but it will be charged $0.006 USD/hr for each unassigned, reserved IP.

「SPACE」 (Static CDN)

Refer to: Spaces

$5 USD/mo, 250GB storage/mo, 1TB transfer/mo. $20 USD/mo, 1TB storage/mo.

image

「BLOCK STORAGE」(Fully functioning storage)

$0.1 USD/GB-mo. $10.0 USD/100GB-mo. $100.0 USD/1TB-mo.

image

「SNAPSHOT」

Refer to: Snapshot overview

$0.05 USD/GB-mo. $1.00 USD/20GB-mo (Lowest)

solomonxie commented 6 years ago

❖ 「AWS EC2」Server Overview [DRAFT]

「PRICING」

On-Demand instances, you pay for compute capacity by per hour or per second depending on which instances you run. Spot instances are available at a discount of up to 90% off compared to On-Demand pricing. Reserved Instances provide you with a significant discount (up to 75%) compared to On-Demand instance pricing.

「SPOT INSTANCE」

Refer to: Amazon EC2 Spot Instances Pricing

The Spot instance is the spare resources of AWS computers, that being said, its existence uncertain, it all depends on the market.

The price for a Spot instance is always changing. And the way to use it is to set a maximum hourly price for each instance. When the price hit the limitation you've set, the instance will be automatically TERMINATED!

Hence, it's not good for long term running, but rather for short term computation needs.

For Asia Pacific (Singapore):

  • Cluster GPU Instances are not available in all regions.

「ON-DEMAND」 Instance (Standard)

Refer to: Amazon EC2 Pricing

For Asia Pacific (Singapore):

Data transfer:

「RESERVED」 Instance (Yearly contract)

Refer to: Amazon EC2 Reserved Instances Pricing

「DETICATED HOST」Instance

Refer to: Amazon EC2 Dedicated Hosts Pricing

「EBS」Elastic Block Storage (including AMI)

Refer to: Amazon EBS Pricing Refer to Stackoverflow: Cost of storing AMI

solomonxie commented 6 years ago

❖ 多设备连接Windows远程桌面

参考:远程桌面问题终极解决方案

Windows服务端设置

同一时间只能在一台电脑中使用同一个用户,如果远程是用administrator用户登录的,那么本地的administrator用户就会被弹出。

多种系统的客户端上连接Windows的远程桌面

Windows上连接另一台Windows的远程桌面

Windows有内置的远程基础设施,所以可以远程、客户端都可以无需安装任何工具就能连接。

Windows客户端设置: 开始菜单中搜索远程连接 - 选择远程连接 - 输入服务端的IP地址和用户名 - 忽略证书之类的直接登录。

Linux上连接Windows的远程桌面

下载rdesktop:

# 安装
$ sudo apt-get install rdesktop

# 连接
$ rdesktop -a 16 -u [USER] -p [PASSWORD] -f -r disk:name=/home/fz -r clipboard:PRIMARYCLIPBOARD -r sound:local [IP-ADDRESS]

Mac上连接Windows的远程桌面

应用商店安装微软官方的Microsoft Remote Desktop 10(免费). 非常简单非常好用。

image

iOS和Android上连接Windows的远程桌面

AppStore中搜索微软官方Microsoft Remote Desktop(免费)。用法一样,非常简单 应用只有18M左右,连接非常快,鼠标操作也很简单:直接在屏幕上移动鼠标,两指一起按相当于鼠标右键,还可以两指放大缩小。声音也可以播放,视频也可以看到(比较慢)

img_5367 img_5368

solomonxie commented 6 years ago

❖ 「AWS Lightsail」 Windows服务器试用感受

Lightsail或EC2都能设置Windows服务器,很简单。

创建好后,默认用户是Administrator,但是密码要等后台生成才能登录。 Lightsail后台里可以直接在浏览器里打开远程桌面,本地(Mac/Win/Linux)的工具连接也很简单。

image

有问题的地方是AWS生成Windows服务器的密码问题,它会生成一串随机的默认密码,需要你等待。

image

但是经常性的密码会无法生成,总显示:

image

根据网上的经验,如果10-15分钟还没有生成好密码,那等多久也没法生成出来,也就没法登录,需要删除实例再创建,直到能生成密码为止(可以换个windows版本试试)

换了几个region,换了个windows(2012),终于可以出来一个有密码的了。如下:

image

然后用administrator用户名,和这个密码,简单顺利登录。 桌面很简单,

image

测试,和一般的windows没什么区别,能正常装软件浏览器,看视频。只不过视频很卡就是了。

另外,同样水准的Windows,网速只有Linux的1/4。而且Windows只对桌面友好,而桌面和GUI的软件有耗费大量内存等资源,所以低配服务器运行还不如自己的500块钱老台式机。

看来低端配置下,果然linux是王道。

solomonxie commented 6 years ago

❖ 「AWS Lightsail」添加额外存储盘

参考官网:Create and attach additional block storage disks to your Linux-based Lightsail instances

首先创建网盘并关联到同国同区的服务器上。

注意:一定要记住自己的服务器是哪个国家和哪个区域的,如果不是同样的位置,不能挂载。

animated-gif-attach-disk-to-linux-wordpress-instance

然后SSH连接服务器,连接终端输入命令,准备挂载硬盘。

查看新磁盘是否格式化过:

# 查看添加的网盘名称和地址(如/dev/xvdf)
$ lsblk

# 查看网盘的文件系统状况(是否格式化了)
$ sudo file -s /dev/xvdf

如果显示一大堆磁盘属性,包括磁盘格式,那么它已经格式化过了,不用继续格式化了 如果显示/dev/xvdf: data,则证明是空盘,没格式化过,需要我们做一下

把刚才的新磁盘格式化为ext4格式:

$ sudo mkfs -t ext4 /dev/xvdf

image

如果要确认一下是否格好了,再次输入sudo file -s /dev/xvdf即可。这时就会显示: image

现在就能开心的挂载磁盘了:

# 创建一个空文件夹(用来挂载磁盘),最好在根目录下,而不是用户目录
$ mkdir /data

# 挂载硬盘
$ sudo mount /dev/xvdf /data

然后就能正常读写操作了。 但是有一点注意,这个挂载的硬盘只能用sudo管理员权限读写,为了方便,可以更改一下磁盘的所有者:

$ sudo chown ubuntu:ubuntu /data

参考官方:网络文件系统 (NFS) 级别用户、组和权限

最后设置每次重启后自动挂载磁盘,编辑/etc/fstab文件,添加如下内容:

/dev/xvdf /data ext4 defaults, nofail 0 2
solomonxie commented 6 years ago

❖ AWS Lightsail/EC2 Ubuntu 安装桌面

低配的EC2服务器,运行桌面的话极其缓慢,打开什么都会卡半分钟,包括文件夹。看视频就更别想了。而且一般也没什么需要桌面的需求,只是玩玩,知道能GUI桌面登录就好了。

主要步骤如下:

VNC服务:「vnc4server」

注意:vnc4server不支持MacOS自带的vnc连接方法,需要安装RealVNC的VNC Viewer一类软件连接。

安装:

$ sudo apt-get install vnc4server

开启/关闭VNC服务的方法:

$ vncserver :1
$ vncserver -kill :1

另外,在使用前,必须要填写VNC的配置文件~/.vnc/xstartup(比如选择什么桌面之类,根据桌面不同配置也不同),才能正确启动。

轻量版桌面:「xfce4」

参考:How to install graphical Desktop in ec2 instance ubuntu16.04 (Linux) and access from mac

$ sudo apt-get install xfce4

需要配置的VNC文件是~/.vnc/xstartup文件,全部修改如下:

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
#xrdb $HOME/.Xresources
#xsettroot -solid grey
#startxfce4&

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &

x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &

sesion-manager & xfdesktop & xfce4-panel &
xfce4-menu-plugin &
xfsettingsd &
xfconfd &
xfwm4 &

配置好后,重启VNC服务,即可登录。

桌面很清简:

image

默认Ubuntu桌面:ubuntu-desktop

参考:阿里云ECS,Ubuntu Server 16.04安装图形界面远程控制

$ sudo apt-get install ubuntu-desktop
$ sudo apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal

# 退出登录
$ exec sh /etc/X11/xinit/xinitrc.

编辑VNC配置~/.vnc/xstartup(包括选择默认桌面等):

#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

配置好后,重启VNC服务,即可登录。

桌面非常丑,而且非常慢。

image

客户端

Mac上文件夹里自带的VNC连接,不支持打开vnc4server生成的远程桌面。所以必须要下载第三方客户端。

推荐用免费简单的VNCViewer。 登录的话直接在地址栏输入类似:34.231.169.129:1即可,注意ip后面有个:1

solomonxie commented 6 years ago

Linux新建管理员账户

# 新建用户
sudo useradd -m USERNAME

# 改密码
sudo passwd USERNAME

# 给用户管理员权限
sudo usermod -aG admin USERNAME
solomonxie commented 6 years ago

VPS分区测速 [DRAFT]

主要方法

# 直接Ping
$ sudo ping -c 10 -i 10000 SERVERIP:Port 

# iPerf(需要服务端运行"iperf -s",并开放相应端口)
$ iperf -c <IP>

# SSH 连接
$ time ssh ubuntu@IP exit

# 上传下载文件(文件是1M)
$ time scp ~/scptest ubuntu@IP:~/
$ time scp ubuntu@IP:~/scptest ~/

# Youtube下载(5M)
$ time youtube-dl --no-continue --proxy "localhost:1080" -f best,mp4 -o ~/speedtest "https://youtu.be/TO9TS4aGWL4"

期望值

Local Average Speed:

Cross Region Expected Speed:

AWS (Amazon Web Service)

Singapore (ap-southeast-1)

Virginia (us-east-1)

Ohio (us-east-2)

solomonxie commented 6 years ago

❖ 「Google Cloud Platform」 GCP Overview [DRAFT]

「PRICING」

「OS」Choices

image

「PRICING」

GCP Free Tier $0/mo

Refer to: Google Cloud Platform Free Tier

GCP Free Tier Compute Engine offers an amount of usage that is free to use, up to a specific limit. These free usage limits are always available even during and after the free trial period. If you go over these usage limits and are no longer in the free trial period, you will be charged according to the price sheet.

Specs:

Compute Engine

Shared-core machine types:

Standard machine types:

App Engine $50/mo

App Engine B1: $0.07 per hour, $50.4 per month.

「GPU」

NVIDIA® Tesla® K80: 1 GPU (12 GB GDDR5), Preemptible $0.135/hr, standard $0.45/hr NVIDIA® Tesla® V100: 1 GPU (16 GB GDDR5), Preemptible $0.74/hr, standard $2.48/hr

「TPU」

solomonxie commented 6 years ago

❖ 「AWS S3」 静态对象存储

静态对象存储的意思就是,和FTP差不多,只能上传、下载、删除,不能修改、更新,更不能存动态数据库一类的东西。 虽然还是有很多差别,但是S3和CDN差不多。

为什么不选择可以当硬盘一样随便操作的EBS而是用静态对象存储的S3呢?

Cost 费用计算

S3一样传承了AWS复杂的Cost Calculation。

每月需要上缴的费用主要是这3部分的总和:

几种个人常见案例(月):

也就是说,API请求非常便宜,数据传输可以通过EC2内部传输的免费额度来省钱,最贵的是数据存储费用。这样来算,个人直接用Glacier最划算。

其中比较乱的是传输费用。

Cost 费用优化

参考:Optimizing Costs for S3 参考:10 Things You Might Not Know About Using S3

创建Bucket

登录AWS进入S3 -> create bucket -> 创建S3全网唯一名称 -> 默认选项 -> 选择公开数据的浏览权限 -> 完成创建Bucket。

过程十分简单,就不截图占地方了。之后都可以修改,填错了也没问题。

下一步:获取secret_key,用于之后各种访问。

进入官网: Security Credential创建key: 选择左侧User -> 为s3创建专门的用户(IAM) -> 输入名称、密码 -> 成功后,获取这个用户独有的key pair -> 记住key pair。

awscli:在命令行客户端控制S3

安装客户端(基于Python,强烈推荐Virtualenv中安装):

$ pip3 install awscli --upgrade --user

配置文件: AWS CLI的配置文件都存在~/.aws目录中,如果没有可以自己创建。具体的每个配置文件,都是ini语法,如同git配置文件一样。

登录认证配置: 文件是~/.aws/credentials,可以配置多项登录用的key pairs:

[default]
aws_access_key_id=YourKeyID
aws_secret_access_key=YourSecretCode

具体的key pair的值,需要到AWS的权限配置中自己添加IAM账户,然后自动获得key pair。 进入官网: IAM - Security Credential

awscli的登录验证已经配置好的情况下,可以直接用aws s3命令进行一系列的操作:

# 列出当前账户下有哪些Bucket
$ aws s3 ls

# 列出指定bucket下有哪些文件
$ aws s3 ls s3://bucket-name/path

# 删除
$ aws s3 rm s3://bucket-name/path/to/file

同步本地和远程的文件夹(方向可换):

# 
$ aws s3 cp /path/to/local/file s3://bucket-name/path/to/file

# 下载

# 同步
$ aws s3 sync <source> <target> [--options]

其中sync同步的选项和网页管理后台中显示的选项一样,有很多需要设置的:

用「s3fs」将S3挂载为本地文件夹 Map S3 as local drive

注意:Public access权限必须设置成Everyone,要不然无法从各种程序访问。 进入bucket的管理后台,选择Permissions,然后设置Public access.

安装工具:

# MacOS
brew cask install osxfuse
brew install s3fs

# Ubuntu
sudo apt-get install -y s3fs

具体步骤参考:https://cloud.netapp.com/blog/amazon-s3-as-a-file-system

# Change key pairs to yours
echo ACCESS_KEY:SECRET_KEY > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs

mkdir ~/s3-drive

# Mount the aws S3 bucket (replace your uid and gid)
s3fs Your-Bucket-Name ~/s3-drive -o umask=0007,uid=1000,gid=1000

# Show all the mounted devices
mount

# Show what's in the bucket
ls ~/s3-drive

「s3fs」的文件读取权限问题

注意,S3的权限问题十分严格。而且每个文件的权限都有可能不一样。 如果是网页上传的,有可能和本地s3fs上传的权限不同,这样就不能互通操作。但是一旦用s3fs上传全部的文件,那么权限就都是统一的。 一旦文件权限没有统一,那么就会在访问时出现No such filePermission denied问题。

目前解决方案有两种:

  1. 为文件设置Headers,格式是x-amz-meta-(mode,mtime,uid,gid)
  2. (推荐) 在启动s3fs挂载时,明确指定umask, uid, gid。如-o umask=0007,uid=1000,gid=1000

有几点需要注意:

如何修改header: x-amz-meta-? 在后台文件管理界面,批量选择文件,然后点Actions,点change metadata,选择x-ama-meta-,输入对应value。

将S3作为Webdav服务器

搜遍了全网,都没找到靠谱的S3转Webdav服务器方案,差点就自己写Webdav的protocol实现了。还好,经过各种换词搜索,灵机一动,换了种思路:可不可以先把S3映射为本地drive,然后再正常把本地drive共享为webdav? 答案是:可以的。

具体做法就是:用s3fs映射到本地文件夹,再用wsgidav或apache或nginx将文件夹共享为webdav服务器。 亲测可用,而且十分好用。因为同属AWS资源,同属一个Region区,所以访问速度和访问EBS硬盘感受不到什么区别。

solomonxie commented 6 years ago

❖ AWS CLI 命令行直接操作AWS控制台

安装(基于Python):

$ pip3 install awscli --upgrade --user

建议在Virtualenv下安装,因为系统级别安装经过测试经常无法安装上。

如同git和docker,awscli分为入口命令和功能命令,入口命令为aws,功能命令各自对应一项aws服务。如aws s3就是针对S3存储的操作。

参考官方所有命令:AWS CLI Command Reference

配置文件: AWS CLI的配置文件都存在~/.aws目录中,如果没有可以自己创建。具体的每个配置文件,都是ini语法,如同git配置文件一样。

登录认证配置: 文件是~/.aws/credentials,可以配置多项登录用的key pairs:

[default]
aws_access_key_id=YourKeyID
aws_secret_access_key=YourSecretCode

具体的key pair的值,需要到AWS的权限配置中自己添加IAM账户,然后自动获得key pair。 进入官网: IAM - Security Credential

配置好后,就可以直接用aws xxx命令操作了。awscli会自动根据你的登录信息,到你的账户查询相关的信息。

S3 静态对象存储

参考官方文档:AWS CLI S3 参考官方文档:Using High-Level s3 Commands with the AWS Command Line Interface

awscli已经配置好的情况下,直接可以用aws s3命令进行一系列的操作:

# 列出当前账户下有哪些Bucket
$ aws s3 ls

# 列出指定bucket下有哪些文件
$ aws s3 ls s3://bucket-name/path

# 删除
$ aws s3 rm s3://bucket-name/path/to/file

同步本地和远程的文件夹(方向可换):

# 
$ aws s3 cp /path/to/local/file s3://bucket-name/path/to/file

# 下载

# 同步
$ aws s3 sync <source> <target> [--options]

其中sync同步的选项和网页管理后台中显示的选项一样,有很多需要设置的:

solomonxie commented 6 years ago

❖ AWS 各种服务之间的沟通 [DRAFT]

「Lightsail」与「AWS S3」的传输

Lightsail是AWS的低端产品,但是又不属于AWS的服务系列,之间交杂不清。所以与AWS的S3之间传输到底怎么算,网上的详细解释很少。根据Lightsail官方FAQ的说法,Lightsail的每个Instance实例都有自己预设的免费传输额,比如最便宜的实例免费额是1TB传输(包括输入输出)。一旦超出1T,那么只对输出收费。但是这个输出指的是使用实例的Public IP输出。也就是说,如果使用Private IP传输,就出入都不收费。但是,只有Lightsail的同Region才能访问到这个Private IP。所以一切在AWS之外的、在AWS内不同区的,都无法访问到Private IP,只能访问Public IP,等同于与Internet传输了。

关于Private IP,参考Lightsail官网:Public IP and private IP addresses in Amazon Lightsail。其中提到,如果要让Lightsail与AWS其它服务进行沟通,需要用到VPC Peering(Virtual Private Cloud)方法,注意,VPC也是一项单独的AWS服务,是按小时付费的。

参考官网:Set up Amazon VPC peering to work with AWS resources outside of Amazon Lightsail

"A VPC is a virtual network dedicated to your AWS account. Everything you create inside Lightsail is inside a VPC, and you can connect your Lightsail VPC to an Amazon VPC." "Some AWS resources, such as Amazon S3, Amazon CloudFront, and Amazon DynamoDB don't require VPC peering to be enabled."

也就是说,从Lightsail访问S3,是不需要启用VPC的。

具体再参考官网:Using Amazon Lightsail with other AWS services

solomonxie commented 5 years ago

各种云服务器网络连接之 常见异常 [DRAFT]

AWS Lightsail 新加坡服务器“整体沦陷”

solomonxie commented on Oct 15

自从十一假日以来(为什么是十一?也许是历史原因?),在Lightsail里创建的新加坡服务器就一直不稳定,shadowsocks断线频率高到每次打开网页都要刷新几次才能刷出来的地步。连基本的SSH都要几次才能连上,换端口完全不影响这个状态,换IP,换服务器,换Shadowsocks算法,换程序,SSH Tunnel,V2Ray(各种配置都试过了),全都不行。外加Cloudflare+Websocket+TLS加持,都没用,这太奇怪了。

一时间懵了。。。。为什么所有东西都试过了,完全不影响这种状态?很奇怪啊。 于是进入了长达两个多礼拜的沉默期,想着忍一忍过去了。直到昨天想到:我还有最后一招,如果这个也不管用就真没办法了——换服务区。 虽然新加坡一直以来是连接大陆最快的线路,但是为了试验,我挑选了次优的日本。

没想到效果出奇的好!日本线路虽然在ping时明显比新加坡慢很多,但是完全没有阻碍、没有屏蔽的话,完全可以忽略那个问题。连接youtube时候"connection speed"一度达到9000 kb/s,真的目瞪口呆。而且无论换哪种shadowsocks算法,或v2ray服务,都没有影响,速度都很快。

所以由此可以得出结论:新加坡服务区整体被盯上了,而且绝对不是破解了某些算法,而是大频率打压一切可疑的连接,甚至打压一切前往新加坡的连接(连最基本的ssh都一样)。

每周日所有地区服务器连接频繁掉线

已经很多个月了,每周日都会频繁掉线,无论是是shadowsocks/ssh/v2ray/甚至http连接,都会连接困难,减速等等。换了无数的主机、地区(东京、首尔、新加坡。。)、服务商(aws、Digitalocean等)。 所以问题在,周日,这个问题上。不知道为什么。

solomonxie commented 5 years ago

Shadowsocks on AWS EC2

Shadowsocks 创建好后无法访问

如果开着ss,打不开谷歌,那么最先尝试的是用ssh连接。如果连接成功,那么说明服务器和网络都没问题。剩下只是配置的事了。

  1. 检查防火墙配置。亚马逊AWS的防火墙是很严格的,所以多半都会卡在这。 如果是AWS的Lightsails的话,直接在Networking配置里,开启全部端口,如下图: image 或者谨慎点,在默认配置的基础上,添加自己连接的端口: image (注意:这里的Custom处是你在设置/etc/shadowsocks.json时候里面的端口)

  2. 还不行的话,就在命令行里主动添加防火墙设置:

    # 下载防火墙设置的软件
    sudo apt-get install firewalld
    # 开启相应的端口
    sudo firewall-cmd --zone=public --add-port=你当前服务器的IP地址/tcp --permanent
    sudo firewall-cmd --zone=public --add-port=你当前服务器的IP地址/udp --permanent

    改好后,就可以通过cat /etc/firewalld/zones/public.xml这个文件里看到,刚刚的防火墙设置已经生效了。

  3. 如果还不行,就试试这招,把ss配置文件的服务器段IP改为0.0.0.0(如果已经是这个设置则反之设置成服务器IP地址),然后保存,并重启ssserver,sudo ssserver -c /etc/shadowsocks.json -d restart。如下图: image

Shadowsocks在AWS EC2运行时的网关设置 (待验证)

Security Groups -> Inbound -> Edit -> Add -> Custom TCP Rule, TCP, 8000 - 9000, 0.0.0.0/0
Security Groups -> Inbound -> Edit -> All traffic, All, All, 0.0.0.0/0
solomonxie commented 5 years ago

远程服务器一键安装开启Shadowsocks脚本

AWS的Lightsails在创建服务器时允许运行初始脚本,这个非常方便,省的我一个一个去敲代码了。

image

以下为脚本内容:

#! /bin/bash
# ---UBUNTU SERVER INITIAL SETUP---
# Notice: 
#    This script should be run by "$ sudo bash xxx.sh"

# Update server & install essentials
sudo apt-get update -y
#sudo apt-get upgrade -y
sudo apt-get install htop

# Install Shadowsocks & create config file
sudo pip install shadowsocks
sudo cat>/etc/shadowsocks.json<<EOF
{
    "server":"0.0.0.0",
    "server_port": 1111,
    "password":"abc123",
    "local_address":"127.0.0.1",
    "method":"aes-256-cfb",
    "local_port":1080,
    "timeout":300,
    "fast_open":false
}
EOF
# Auto start Shadowsocks service when system starts
#sudo echo "ssserver -c /etc/shadowsocks.json -d start" >> /etc/rc.local

# Start Shadowsocks server
sudo ssserver -c /etc/shadowsocks.json -d start

不要忘记ssh登录的设置,把本地~/.ssh/id_rsa.pub的内容复制到SSH Keypair里面,这样之后就不需要登录密码了。

注意,生成好服务器后,一定要去开启端口才能生效。 方法是: 点击这个服务器页面 -> Networking -> Firewall, 然后添加一个Custom端口,号码为刚刚脚本中设定的端口号码。

另外,如果不是使用Launch Script初始脚本,也可以直接自己用ssh把脚本上传到服务器,再执行。 方法如下:

# 上传shell脚本到服务器用户目录
$ scp ./server-init.sh user@ip-address:~

# ssh进入服务器终端
$ ssh user@ip-address

# 运行脚本
# sudo bash ~/server-init.sh
solomonxie commented 5 years ago

❖ Google Drive Mount onto Local File System [DRAFT]

Google提供了官方版本的Google Drive Stream,即将Google Drive映射为本地文件夹的工具,但是只提供给Mac和Windows。 但是Google drive stream不支持personal个人帐户,只支持企业帐户和学校帐户。

对于Linux,Google没有打算制作这个工具。但是有很多第三方工具可以实现,目前最好的是ocamlfuse

以下分别讲解安装使用方法。

Google Drive Stream for Mac

参考官方:Deploy Drive File Stream

image

建议删除本机的Backup and Sync软件,并删除~/Google Drive文件夹(如果存在的话).

# 下载工具
$ wget https://dl.google.com/drive-file-stream/GoogleDriveFileStream.dmg

# 后台挂在dmg镜像并安装
$ hdiutil mount GoogleDriveFileStream.dmg; 
$ sudo installer -pkg /Volumes/Install\ Google\ Drive\ File\ Stream/GoogleDriveFileStream.pkg -target "/Volumes/Macintosh HD"; 
$ hdiutil unmount /Volumes/Install\ Google\ Drive\ File\ Stream/

# 卸载
sudo mv /Applications/Google\ Drive\ File\ Stream.app/ /tmp/
sudo mv ~/Library/Application Support/Google/DriveFS/ /tmp/

配置: 配置文件为~/Library/Preferences/com.google.drivefs.settings

Proxy代理网络设置: 参考官方:Configure Drive File Stream

solomonxie commented 5 years ago

❖ 「Aliyun ECS」 Server Overview [DRAFT]

「REGION」

「OS」Choices

image

「INSTANCES」

t5 Burstable instance 突发性能实例

性能最低,且以CPU积分的方式计费。

"每台t5实例都有一个基准CPU计算性能,并会根据实例规格以指定速度持续获取CPU积分。每台t5实例一旦启动,就会开始消耗积分以满足需求。当实例实际工作性能高于基准CPU计算性能时,会消耗更多的CPU积分来提升CPU性能,满足工作需求。"

参考:阿里云 突发性能实例 > 基本概念 参考:阿里云 t5性能约束实例

image

t5实例的规模类型:

所拥有的积分消耗完后,实例的CPU使用率,最大只能为单位CPU占用,一个单位占用为10%或15%,每种实例规模不同。当然,这个时候可以选择减少CPU使用,来增加积分。

image

t5实例的约束选项:

「PRICING」

其中,在最便宜的t5 nano实例中,公网IP几乎增加了一倍的成本:无公网IP的实例仅为7元/周。 如果选择不使用系统分配的公网IP,则需要自己购买阿里云弹性公网IP: 固定带宽计费的话,最便宜也是8.4元/周。

能选择的最便宜实例: image

「弹性公网IP」

如果选择不使用系统分配的公网IP,则需要自己购买阿里云弹性公网IP.

「CPU积分实测」

基本上感受是:

总结就是:如果作为个人的”网络中转站“,t5.nano的CPU积分基本上不会超,而且还会有剩余。

我设定的是CPU占用整个小时平均都超过10%就发邮件,于是就频繁收到监控台的警报邮件。 于是检查了下HTOP,发现后台各种阿里云的进程乱飞,实在不能忍啊!最重要是: 让CPU占用超10%的,恰就是阿里云监控台本身! image

可以看到,这个服务器我几乎没在用什么,放在那浪费的。只是阿里云自己的服务占用了这么大的CPU资源,这让人怎么想?

「t5.nano 1Mbps」 Net Speed 网速实测

就结果来说,可以是相当的失望。比起AWS等国际服务器,在网络的速度、带宽、价格上根本不能比。

本机是北京100MB带宽的宽带,日常下载可高达7Mbps,上传可达1Mbps。

网络通畅下,北京客户端连接阿里云青岛服务器:

感受:这种速度和便宜很多的AWS实例,在不被干扰情况下网速慢了十倍以上。

solomonxie commented 5 years ago

❖ 理解IaaS, SaaS, PaaS等云模型 (Cloud Models)

参考:SaaS vs PaaS vs IaaS: What’s The Difference and How To Choose 参考:怎么理解 IaaS、SaaS 和 PaaS 的区别?知乎

如何快速记忆区分这几个名字? 秘诀:只要记住几个首字母即可:包括I,P,S. 其中I-Infrastructure; P-Platform; S-Service. 后面的话都是统一的aaS,即"as a service"。后面这个不重要,换成"as a product", "as a f__", "business"什么的,都无所谓。

为什么要提到记忆问题?因为如果不先在脑子里区分这几个单词,那么即使看过类各自代表的意义,第二天也会忘的一干二净。

记住了名字后,我们先要知道这几个东西是在说什么。

IaaS, PaaS, Saas, 都是Cloud Models,即云端项目的模型。 如果你要组成一个在线运行的云项目,必须具备很多组件,如硬件的CPU、硬盘,软件的OS系统,HTTP服务器,数据,应用程序等等。根据app需求,它们的搭配运作肯定是你指定的,也就是“固定”的。

但问题是,各个组件谁来提供?谁来管理? 根据各个组件的提供和管理者的不同,就划分出了不同的Cloud Models

image

简单来说:

这些很好理解。真正用起来,就针对不同的项目不同的细节了,这里不多说。下面就说说各自的特点。

各个云模型特点

IaaS (硬件服务)

相当于让你租硬件。

优点:

案例: 一般是VPS云服务器提供商。 DigitalOcean, Linode, Rackspace, Amazon Web Services (AWS), Cisco Metapod, Microsoft Azure, Google Compute Engine (GCE)

PaaS (平台服务)

相当于让你租硬件和系统级软件。

优点:

案例: 一般是具体的云服务提供商。 AWS Elastic Beanstalk, Windows Azure, Heroku, Force.com, Google App Engine, Apache Stratos, OpenShift

SaaS (全套服务)

相当于让你租软件硬件全团队服务,你只是个给钱的土豪甲方。

优点:

案例: 一般是完整的云应用。 Google Apps, Dropbox, Salesforce, Cisco WebEx, Concur, GoToMeeting

solomonxie commented 5 years ago

Work with S3 in Python

import boto3
s3 = boto3.resource(
    's3',
    aws_access_key_id = 'S3_ACCESS_KEY_ID',
    aws_secret_access_key = 'S3_SECRET_ACCESS_KEY',
#    endpoint_url = 'http://192.168.1.70:9000',
    endpoint_url = 's3://xxxx/',
)

obj = s3.Object('BUCKET_NAME', 'target_key')
data = obj.get()['Body'].read()
solomonxie commented 4 years ago

Lightsail 带宽测试 (转发)

参考:https://servercat.net/20180912-lightsail-japan/

image

image

image

solomonxie commented 4 years ago

Docker一键部署Shadowsocks + Kcptun

分别部署:Shadowsocks和Kcptun两个容器

Shadowsocks服务器:

# 使用shadowsocks官方容器
docker run -d --restart always -p 6000:8388 -e METHOD=aes-256-gcm --name "ss6000" \
    -e PASSWORD=shadow123 shadowsocks/shadowsocks-libev

记住上面ss对外暴露的是6000端口。

Kcptun服务器:

# xtaci/kcptun 为kcptun的官方容器
docker run --name kcptun -p 6000:6500/udp -d --restart=always xtaci/kcptun \
    server -t "$(hostname -i):6000" -l ":6500" -key "kcptun123" -crypt aes \
    -datashard 10 -parityshard 3 -mtu 1350 -sndwnd 512 -rcvwnd 512 -dscp 0 -mode fast2

Kcptun也可以暴露同样的6000端口,两者一个用tcp一个用udp,互不冲突,比较好记。

Mac上ShadowsocksX-NG客户端连接: image

统一部署:Shadowsocks + Kcptun 同在一个容器内

参考:https://github.com/mritd/dockerfile/tree/master/shadowsocks

# 使用第三方镜像:mritd/shadowsocks
docker run -dt --name ss -p 6000:6443 -p 6000:6500/udp \
    -e SS_CONFIG="-s 0.0.0.0 -p 6443 -m aes-256-gcm -k shadow123" \
    -e KCP_CONFIG="-t 127.0.0.1:6443 -l :6500 -mode fast2" -e KCP_FLAG="true" \
    -e KCP_MODULE="kcpserver"  mritd/shadowsocks
solomonxie commented 4 years ago

腾讯云CVM Overview [DRAFT]

参考定价:https://cloud.tencent.com/product/cvm/pricing

solomonxie commented 4 years ago

腾讯云“S3”对象存储 COS

Region区域名称: image image

使用Web网页客户端操作

进入COS Console:https://console.cloud.tencent.com/cos

image

创建后进入Bucket的主页,在这里进行各种控制: image

使用官方桌面客户端操作

电脑的客户端强制要求使用key和secret来登录。

除了登录外,使用方法和WEB大致相同: image

使用Cyberduck桌面客户端操作

填写自定义endpoint-url(注意复制的时候不要加上http): image

使用Python boto3操作

import os
import boto3
from logging import getLogger

import settings

logger = getLogger(__name__)

class S3Operator:
    def __init__(self, access_key=None, secret=None, endpoint=None, region=None):
        self.client = self.get_s3_client(
            access_key or settings.AWS_ACCESS_KEY_ID,
            secret or settings.AWS_SECRET_ACCESS_KEY,
            endpoint=endpoint,
            region=region
        )
        self.resource = self.get_s3_resource(
            access_key or settings.AWS_ACCESS_KEY_ID,
            secret or settings.AWS_SECRET_ACCESS_KEY,
            endpoint=endpoint,
            region=region
        )

    def get_s3_client(self, access_key, secret, endpoint=None, region=None):
        return boto3.client(
            's3',
            aws_access_key_id=access_key,
            aws_secret_access_key=secret,
            endpoint_url=endpoint,
            region_name=region,
            # config=boto3.session.Config(signature_version='s3v4'),
        )

    def get_s3_resource(self, access_key, secret, endpoint=None, region=None):
        return boto3.resource(
            's3',
            aws_access_key_id=access_key,
            aws_secret_access_key=secret,
            endpoint_url=endpoint,
            region_name=region,
            # config=boto3.session.Config(signature_version='s3v4'),
        )

    def upload_file(self, localpath, bucket_name, object_name=None):
        if not os.path.exists(localpath):
            return False
        object_name = object_name or os.path.basename(localpath)
        try:
            self.client.upload_file(localpath, bucket_name, object_name)
        except S3Exception as ex:
            print(ex)
        return True

    def get_signed_url(self, bucket_name, object_name, expiredin=86400, httpmethod=None):
        url = self.client.generate_presigned_url(
            ClientMethod='get_object',
            Params={
                'Bucket': bucket_name,
                'Key': object_name,
            },
            ExpiresIn=expiredin,
            HttpMethod=httpmethod,
        )
        return url

    def create_bucket_if_not_exists(self, bucket_name):
        existing = [b['Name'] for b in self.client.list_buckets()['Buckets']]
        if bucket_name not in existing:
            info = self.resource.create_bucket(Bucket=bucket_name)
            print('Created bucket:', info)
        return self.resource.Bucket(bucket_name).creation_date

    def delete_bucket(self, bucket_name):
        existing = [b['Name'] for b in self.client.list_buckets()['Buckets']]
        if bucket_name in existing:
            bucket = self.resource.Bucket(bucket_name)
            _ = [key.delete() for key in bucket.objects.all()]
            bucket.delete()

    def list_objects(self, bucket_name):
        keys = [obj.key for obj in self.resource.Bucket(bucket_name).objects.all()]
        return keys

使用aws-cli命令行工具操作

参考:https://github.com/aws/aws-cli/issues/1270 参考:http://www.lbtyeya.com/cloud_tencent_/developer/article/1557702

配置文件:

# 此处使用AWS
[default]
aws_access_key_id=abc
aws_secret_access_key=abc
region = us-east-1
output = json

# 此处是使用腾讯云
[profile tencent]
aws_access_key_id=abc
aws_secret_access_key=abc

然后再命令行里

# 列出此region的所有bucket
aws --profile tencent --endpoint-url http://cos.ap-beijing.myqcloud.com s3 ls

# 列出某个bucket的所有文件
aws --profile tencent --endpoint-url http://cos.ap-beijing.myqcloud.com s3 ls --recursive s3://BucketName/

如果想把endpoint-url加到配置文件里这样就不需要每次都在命令里面指定,这需要安装aws-cli的第三方插件awscli-plugin-endpoint: Refer to: https://github.com/wbingli/awscli-plugin-endpoint

pip install awscli-plugin-endpoint

然后在aws配置文件里面加一段这个来指定插件:

[plugins]
endpoint = awscli_plugin_endpoint

整体效果如下:

[plugins]
endpoint = awscli_plugin_endpoint

[default]
region = us-east-1a
output=json

[profile tencent]
aws_access_key_id = abc
aws_secret_access_key = abc
region = ap-beijing
output = json
s3 =
    endpoint_url = http://cos.ap-beijing.myqcloud.com

当然,还可以为aws的各个子命令配置不同endpoint:

[profile localstack]
s3 =
    endpoint_url = http://localhost:4572
kms =
    endpoint_url = http://localhost:4599
lambda =
    endpoint_url = http://localhost:4574
iam =
    endpoint_url = http://localhost:4593
kinesis =
    endpoint_url = http://localhost:4568
logs =
    endpoint_url = http://localhost:4586
sts =
    endpoint_url = http://localhost:4592
ec2 =
    endpoint_url = http://localhost:4597

最后使用的时候,直接指定profile即可:

aws --profile tencent s3 ls

使用Grep删除一些匹配的文件

bucket="BucketName"
for f in $(aws --profile tencent s3 ls --recursive --human-readable "$bucket/" |grep 'some_pattern' |awk '{print $5}')
do
    aws --profile tencent s3 rm "s3://$bucket/$f"
done