用S3做资源下载和P2P种子

有时候我们想分享个资源给别人,但是放在线上业务的Nginx上也不太合适,这是可以上传到S3,然后把object设置ACL为public-read,然后拼装下下载的url就可以提供给任何人下载,同时,bucket可以设置lifecycle,可以设置该bucket下的某个目录下的资源的生存天数,到期后自动被删除。

上传S3的部分就不说了,详见这个页面(python版的)
http://boto.readthedocs.org/en/latest/s3_tut.html#storing-large-data

然后我们可以设置ACL给object,然后拼出下载的url和torrent的url

import boto
c = boto.connect_s3()
b = c.get_bucket(bucket_name)
b.set_acl('public-read', object_key)
object_download_url = "http://" + bucket_name + ".s3.amazonaws.com/" + object_key
object_torrent_url = object_download_url + "?torrent"

这个S3的下载url后面加上?torrent就可以以P2P协议下载,直接点这个url会下载下来一个BT种子。

SES and WorkMail

AWS最近推出了WorkMail服务,用来代替公司内部自己搭建的Exchange邮件服务。WorkMail接管了exchange server那部分功能,可以使用自己的域名,也可以与自己的域打通。收费情况是按用户,每月每个用户的费用为 4 USD,其中包括每个用户 50 GB 的存储容量。WorkMail是可收发邮件的邮件服务。
而之前的SES(Simple Email Service)是只能发出去邮件的服务,不能用于接收,比较适合单向发送。
用于员工桌面的电邮服务这次不提,先说说运维中的项目邮件需求。
项目中一般会遇到需要发送电子邮件的功能,也有的用户需要收发功能,但是以单向发送为主。因此非常适合将SES和WorkMail结合配合使用。
具体做法:用WorkMail创建域名邮箱,并添加需要收发功能的账户,并用其中的一个账户去验证SES,使其变成SES合法发送的电子邮箱账户,然后用SES去发送单向的推广邮件和密码找回之类的邮件。
SES是按千封数量来收费,而WorkMail是按包月来收费,这就造成发单向邮件时,有时候用SES便宜,有时候用WorkMail便宜:
当使用SES发送邮件量不是非常大的时候,SES费用低于WorkMail单用户的包月费用,这时候就使用SES来发送推广邮件和密码找回类似的邮件;但是如果你使用SES发送邮件的费用超过了WorkMail包月的费用,那切换成WorkMail也很方便。

关于定价:
WorkMail:每月每个用户的费用为 4 USD,其中包括每个用户 50 GB 的存储容量。
SES: 官方说法如下:

如果您是 Amazon EC2 用户,您可以免费试用 Amazon SES。当您从 Amazon EC2 实例直接或通过 AWS Elastic Beanstalk 调用 Amazon SES 时,您可以每天免费发送 2,000 封电子邮件。许多应用程序能在此免费套餐限制内完整运行,并且 1 年后不会过期。

注:数据传输费仍适用。对于符合 AWS 免费使用套餐条件的新 AWS 客户,您在所有 AWS 服务中总计可获得 15 GB 传出数据量,这应当能弥补您的 Amazon SES 数据传输费用。此外,所有 AWS 客户可以每月可获得 1GB 数据传输量。
电子邮件费用为每 1000 封 0.10 USD。每发送 1 GB 附件 0.12 USD。

几个第三方清CloudFront缓存工具

除了web console上的清缓存的页面,我们也可以给非AWS管理员使用一些第三方的清缓存的工具
• CloudBuddy Personal – http://m1.mycloudbuddy.com/index.html
• CloudBerry Explorer – http://cloudberrylab.com
• Ylastic – http://ylastic.com
• Cyberduck – http://cyberduck.ch
• Bucket Explorer – http://www.bucketexplorer.com
• CloudFront Invalidator – http://www.swook.net/p/cloudfront-invalidator.html
• CDN Planet CloudFront Purge Tool – http://www.cdnplanet.com/tools/cloudfront-purge-tool/
CloudBerry用过S3资源管理上传下载非常方便,也可以用来管理CF资源,但是免费版,清缓存,只能一次一个,不能针对目录
Ylastic是自己开发了个AWS资源管理和真是的网站,收费的,没体验过
Cyberduck大黄鸭是个客户端的工具,跟CloudBerry类似,但是不如CB好用,也是一次清一个,不能清目录
CloudFront Invalidator是个第三方版的web版的清缓存的工具,在线使用,跟web console一样,一行一个对象,可以写多行
CDN Planet CloudFront Purge Tool做成了chrome扩展,可以清多个CDN的,也是一个对象一行
Bucket Explorer是个收费的客户端工具,也是一个对象一行,写目录也不报错,不知有无效果

或者自己写个脚本批量清缓存也行,每次请求只能最多1000个对象,再多就需要用多个请求来处理,python示例如下

import boto

distribution_id = 'xxxxxxxxxxxx'
paths = ['/path/7eleven.png', '/path/alipay.png', '/path/Braintree.png']

c = boto.connect_cloudfront()
inval_req = c.create_invalidation_request(distribution_id, paths)
print inval_req.paths
invals = c.get_invalidation_requests(distribution_id)
for inval in invals:
    print 'Object: %s, ID: %s, Status: %s' % (inval, inval.id, inval.status)

或者把对象写在文件中,一行一个,用python load进paths这个list中处理:

import sys,os

input_fle = os.sys.path[0] + os.sep + 'purge-object.txt'
f = open(input_fle,'r')
paths = []
for line in f:
    line = line.strip()
    paths.append(line)
print paths

使用SES发邮件

How to use SES, and Using SMTP to Send Email with Amazon SES
(1) 使用SES(Simple Email Service)发邮件的时候,我们需要添加一个发件者邮箱(verify email sender),SES使用这个发件者邮箱作为发件者,添加完认证发信者之后,需要登录发信者邮箱点击确认连接。
SNS(简单消息服务)还有个类似的功能,叫topic,类似邮件组,将多个verified receivers添加到一个topic,然后在CloudWatch或者其他的服务调用,来发群邮件。这次先不讨论SNS。
可以使用下面这小段代码来添加verified sender

import boto.ses
conn = boto.ses.connect_to_region('us-east-1')
conn.verify_email_address('sender@address.com')

对了,截止我写这些时,SES只支持三个地区,Virginia,Ireland,Oregon(分别对应us-east-1, eu-west-1, us-west-2)
(2) 接来下我们收集SMTP credential相关信息
在SMTP Settings里面我们可以看到SMTP相关信息,例如Virginia地区的:

Server Name:                          email-smtp.us-east-1.amazonaws.com
Port:                                 25, 465 or 587
Use Transport Layer Security (TLS):   Yes
Authentication:                       Your SMTP credentials - see below. 

然后在下面创建SMTP credential点击创建,他就自动创建了一个IAM角色并授权,并产生一组了类似AccessKey的信息,不过名字变成Username和password,形如:

IAM User Name,Smtp Username,Smtp Password
"ses-smtp-user.xxxx",AKIxxx,Aqbxxxxxxxxxxxxxxxxxx

(3) 这样使用SMTP发邮件的信息收集全了。可使用ConfigObj来加载配置文件中的Credential,并用smtplib来创建发邮件的对象

import smtplib
from configobj import ConfigObj

cfg = ConfigObj(config_path)
cfg_dict = cfg.dict()
host = cfg_dict["server"]
from_addr = cfg_dict["from_addr"]
username = cfg_dict["username"]
password = cfg_dict["password"]

server = smtplib.SMTP(host)
server.starttls()
server.login(username, password)
server.sendmail(from_addr, receivers, BODY)
server.quit()

配置文件形如:

server = email-smtp.us-east-1.amazonaws.com
from_addr = sender@domain.com
username = AKIxxx
password = Aqbxxxxxxxxxxxxxxxxxx

使用docker-enter来进入docker容器

docker容器没起sshd服务的时候,还想进入docker怎么办,我们可以使用nsenter进入docker容器的命名空间namespace来虚拟登入docker容器。
nsenter一般默认自带了,没有的话,安装下。然后把如下这个脚本命名成docker-enter或者别的名字,赋执行权限,放入$PATH下即可,使用方式:docker-enter <container-id>

#!/bin/sh

if [ -e $(dirname "$0")/nsenter ]; then
    # with boot2docker, nsenter is not in the PATH but it is in the same folder
    NSENTER=$(dirname "$0")/nsenter
else
    NSENTER=nsenter
fi

if [ -z "$1" ]; then
    echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
    echo ""
    echo "Enters the Docker CONTAINER and executes the specified COMMAND."
    echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
    PID=$(docker inspect --format "{{.State.Pid}}" "$1")
    if [ -z "$PID" ]; then
      exit 1
    fi
    shift
    OPTS="--target $PID --mount --uts --ipc --net --pid --"
    if [ -z "$1" ]; then
      # No command given.
      # Use su to clear all host environment variables except for TERM,
      # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
      # and start a login shell.
      "$NSENTER" $OPTS su - root
    else
      # Use env to clear all host environment variables.
      "$NSENTER" $OPTS env --ignore-environment -- "$@"
    fi
fi