AWS SES SMTP

前兩周碰到 GMAIL 很 GY 的問題,想說要不要去申請 MailGun ,後來想說,要另外申請服務挺麻煩(畢竟不是自家用),AWS 應該有這類服務吧。去 Google 以後,才發現自己之前有用過,只是全都忘光光了,這次要紀錄下來。這次的紀錄重點:

  1. 簡介
  2. 需要什麼?
  3. 如何移出 Sandbox?

AWS SES 是 AWS 的大規模電子郵件解決方案,可以用來寄發大量的電子郵件。他除了有提供 SMTP 設定之外,也可以直接使用程式來寄送。用 SMTP 設定方便的地方在於各個語言都有 SMTP 的函式庫可以用,所以設定填一填就可以寄了,不用額外再加函式庫。

要申請這個服務,要預先準備好網域,因為他是以網域為基礎。首先要新增網域,在進行新增網域的步驟時,步驟的說明會詳列出你該怎麼做來進行後續的驗證。這部份蠻簡單的,就只是去新增一個網域記錄,然後把 AWS 要求你填的資訊放進去就可以了。

在新增網域並進行驗證以後,就可以使用 SES SMTP 或是用程式去寄了。只是這時候是在 Sandbox 裡,有限制在的,不能寄太多信,寄件者跟收件者也都有限制。AWS Management console 也會提醒你,現在還在 Sandbox,如果需要提升額度或是可以寄送到外面,必須要提出申請 (有連結可以按),這邊就是照網頁說明去提出申請即可。提出申請時,AWS 會要求你回答幾個問題。這幾個問題主要是要確保 AWS 自身的立場,也就是當有人回報信件被濫用或退信時(抱怨),該怎麼去處理。

AWS 建議的作法就是要求你使用 AWS SNS ,當有退信或是抱怨時,讓 AWS 可以透過 AWS SNS 去通知你。AWS SNS 可以用郵件通知或是用 HTTP/HTTPS 去通知你的網站進行自動處理等等的。我後來是簡單的設定 AWS SNS,用郵件來通知我,等以後再來改成讓網站自動處理。

參考資料(來自AWS 文件):

AWS S3/Glacier select

前幾天看 S3/Glacier FAQ 時,看到有 SELECT 這個功能,是去年推出的。S3/Glacier select  這功能是這樣子,你可以把 CSV/JSON/Apache Parquet 這幾種格式的檔案放到 S3/Glacier 上,然後就可以使用類似 SQL 的敘述來查詢檔案內容。

所以我們可以把不常使用的資料從資料庫移轉到 S3/Glacier 上,需要時,再使用 S3 SELECT 來查詢。這樣資料庫不需要一直擴充容量,放到 S3/Glacier 可以降低資料庫儲存的成本。

使用範例:

不過,網路上能找到的範例多半都是使用 CSV,那使用 JSON 又是如何呢?我試了以後,發現這個 JSON 格式不是我在 Python 用 json.dump() 傾印出來就搞定的。資料是陣列時,要針對每個元素去 dump,不可以是 [{}, {},…] 這樣,必須是 {} {} {} 這樣子,AWS API 才不會報錯 (參考:stackoverflow – amazon s3 – s3-select querying data on field name)。

import json

with open('output.json', 'wt') as fout:
  for obj in objs:
    json.dump(obj, fout, indent=2, ensure_ascii=True)
# 輸出結果
"""
{
  "id": 13930241}{
  "id": 13930240}
"""

算IOPS

上個月公司 AWS 帳單來時,看到 EBS 使用率提高,所以費用增加不少

剛剛去算了一下目前的 IOPS ,然後套到 aws 計算機去算。

先用 AWS CloudWatch 去指定要看的 EBS volume 、指標(VolumeReadOps/VolumeWriteOps)以及日期區間,把統計方式改為總和,然後用最高點的數值套這公式: (VolumeReadOps + VolumeWriteOps) / 區間的秒數,算出目前用的 IOPS 是 106 左右。

計算方式是參考這兩個連結:

然後到 AWS 計算機網頁,目前 EBS volume type 是 magnetic(standard),storage  250 G,IOPS 填入 106,算出金額約 39.79,接著將 Volume type 改為 gp2,金額變成 26.40。

所以選擇適當的 EBS volume type 是有助於省錢的。

s3proxy

網址:https://github.com/gaul/s3proxy
可以在本機端測試 S3,而不需要去開 S3 bucket 跟弄 AWS credential ,s3proxy 提供了跟 S3 一樣的 API 介面。

boto3 可以用,用法參考這邊:https://github.com/gaul/s3proxy/wiki/Client-compatibility-list

# Python3 + boto3 example
session = boto3.session.Session(aws_access_key_id='identity',
                                aws_secret_access_key='credential')
config = boto3.session.Config(s3={'addressing_style': 'path'})
# low level S3 client
client = session.client('s3', endpoint_url='http://localhost:60080',
                        config=config)
# S3 resource object
resource = session.resource('s3', endpoint_url='http://localhost:60080',
                            config=config)

用 docker 快速啟動

mkdir -p /tmp/data
docker run --publish 60080:80 -v /tmp/data:/data --env S3PROXY_AUTHORIZATION=none andrewgaul/s3proxy

django-storage 的話,應該是要改設定裡的 AWS_S3_ENDPOINT_URL

boto3 create_instances/run_instances

create_instances 是 boto3.resource(‘ec2’) 提供的,而 run_instances 是 boto3.client(‘ec2’) 提供的。

  • client(‘ec2’): A low-level client representing Amazon Elastic Compute Cloud (EC2)
  • resource(‘ec2’): A resource representing Amazon Elastic Compute Cloud (EC2)

主要不同點:Resources represent an object-oriented interface to Amazon Web Services (AWS). They provide a higher-level abstraction than the raw, low-level calls made by service clients. To use resources, you invoke the resource() method of a Session and pass in a service name。

也就是說實際上 ServiceResource 會去使用 client,簡單的說 ServiceResource 是一個 client wrapper (這可以從 boto3/session.py 看到)。

友情小提示:在閱讀程式碼時,用 function name 去找,會發現都找不到,實際上 boto3 library 會將 function call/parameters 轉換為 AWS API  呼叫送出去。

s3cmd

想要把某個 bucket 裡的檔案備份到另外一個 bucket 去,找了一下,在 StackOverflow 上找到這篇:How do I back up an AWS S3 Bucket without versioning the source bucket [closed]
裏面提到一個 s3cmd 的指令,只要簡單的下 s3cmd –recursive cp s3://bucket_a s3://bucket_b 就可以了。
在 Ubuntu 14.04 裡只要使用 sudo apt install s3cmd 就可以安裝了,使用前需要使用 s3cmd –configure 來設定 AWS Access key id 跟 secret access key。
想要安裝最新版本,可以使用 pip 來安裝。

awscwxls – 將 CloudWatch 數據匯出為 xls/xlsx

有人把程式寫好了,所以拿來用就可以:Exporting AWS CloudWatch Data | Pete Zybrick

  1. 確定有設定好 $HOME/.aws 目錄下的檔案。
  2. petezybrick/awscwxls: AWS Cloudwatch to Spreadsheet 上 git clone 下來
  3. 到 run 目錄下,先複製 properties/first.properties 為一個新的檔案,例如 properties/example.properties。然後修改內容,awscwxls 會讀取這個檔案的內容當作參數,像是要拿哪些數據、取哪些 instance、起始時間、區域等等的,都是在這邊設定。時間是用當地時間,程式會自動轉換為 UTC 時間 (AWS 上的時間)。
  4. 執行 ./runcwxls (Windows 下是 runcwxls.cmd) ,runcwxls 就會把取得的數據存到 xlsx 裡去了。

OpsWork / Terraform / Vagrant 小感

Vagrant 其實不太能拿來跟 OpsWork 或 Terraform 相比,不過有了 push 之後,算是有個堪用的 deploy 方法…

前一陣子看到 Terraform ,只要寫好腳本(或者該說是計劃),這工具就會自動幫你把環境佈署到雲端,比如說,你有 Web application、Web Server、Database、HAProxy … 等等,在腳本描述好關係之後,Terraform 可以自動幫你佈署到 AWS 、DigitalOcean、CloudStack、Docker、Google cloud 、OpenStack、Heroku … 等地方,非常的方便。但如果要用在內部的環境,可能就沒辦法 (除非內部自架了 CloudStack 或 OpenStack)。

OpsWorks 是在 DevOps gitter 裡看到的,Google 了一下,這是 Amazon 提供的服務,做的事情其實跟 Terraform 蠻相近的,跟 Amazon 的服務整合度更高。我是還沒試用過,不知道好不好用。

Vagrant 本身是操作虛擬機器的好幫手,在 Google Altas 時,看到 Vagrant 有提供 push 這子指令,這可以用來做 deploy 。比如說,你在 Vagrantfile 裡描述了 Web application server、Web Server、Database server … 等等,在本地端可以用 vagrant up  啟動,進行驗證,那要實際佈署到遠端時,就可以用 push 來做。push 的對象(或者該說是方式?)可以是 Altas、FTP/SFTP、Heroku 或執行自訂的腳本,所以看起來或許適合我現在的情境。

順便記一些連結: