Author: Ken

  • How to configure AWS SES with Postfix MTA

    眾所周知email spam是internet上最讓人討厭的東西,所以很多雲端服務包括aws都會有一個默認的限制,從instance不能發送郵件出去,需要提交工單到客服那邊人工開通。

    但是有時候我們只是需要測試一下application的email發送功能怎麼辦呢,難道去叫客服開通嗎?

    這個時候我們可以使用postfix來把aws的ses service當作email relay就可以了,沒有申請到正式服務之前的ses會運行在sandbox,有一些限制,比如只能發送email到驗證過的domain或是email address,這很簡單,我只需要驗證一下就可以,aws會發送一封email到郵箱來驗證,點他。至於domain的部分,則是需要增加三條cname記錄,等上一兩個小時就可以。

    至於發送數量和頻率,則限制在每二十四小時200封email,每秒鐘一封。

    當email address和domain的驗證都完成,這個時候需要進行smtp 的配置,至少要有個username和password吧,從webconsole來配置同樣很簡單,點擊Create SMTP credentials的時候,他就會自動在IAM中創建最小權限的用戶以及access key作為smtp的password。

    在aws創建好ses資源,接下來就是在instance上配置postfix的部分,

    以Amazon linux 2023為例,首先安裝必要的組件:

    dnf install postfix cyrus-sasl-plain -y

    然後為postfix 增加一點點配置,請注意改成你自己的domain:

    postconf -e "relayhost = [email-smtp.ap-northeast-3.amazonaws.com]:587" \
    "smtp_sasl_auth_enable = yes" \
    "smtp_sasl_security_options = noanonymous" \
    "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
    "smtp_use_tls = yes" \
    "smtp_tls_security_level = encrypt" \
    "smtp_tls_note_starttls_offer = yes" \
    "myhostname = aws.bbken.org" \
    "mydomain = bbken.org" \
    "smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt"
    
    vi /etc/postfix/sasl_passwd
    
    [email-smtp.ap-northeast-3.amazonaws.com]:587 AKIJJ6XRR6XR6XR6XR54:jKKDeblcjKKDeblcPuPGYKDeblcPuPGYuPGYcVqnE3y
    
    chmod 600 /etc/postfix/sasl_passwd
    
    postmap -v hash:/etc/postfix/sasl_passwd
    
    systemctl enable postfix
    
    systemctl start postfix

    最後我們可以進行一點點測試:

    sendmail -vv root@bbken.org

    或者

    echo 'This is a test mail from aws ses' | mail -s 'Your Amazon SES account is in the sandbox in Asia Pacific (Osaka)' root@bbken.org

    如果需要發送email到別的domain,也就是任意郵箱,那麼需要在ses 服務裡面Request production access。

    參考文件:https://www.cyberciti.biz/faq/how-to-configure-aws-ses-with-postfix-mta/

  • P&G真是無處不在的托拉斯

    我想光華商場其實跟每個城市都有的電腦商城差不多,唯一的區別是這裡的騙子可能比其他國家要少,這裡的國家當然指的是中國,還有youtube上附近沒有電子商城的美國鄉村,特別是那些在GitHub project的readme裡面聲明Don’t use cheap Chinese made usb cable to flash的developer 。

    來過兩次,但都很匆忙,沒有認真看,大部分的攤販都是筆電和遊戲機,這裡的遊戲機既有ps,xbox,也有rog,但我是不玩遊戲的,一群宅男圍在門口的showgirl旁邊,望著她們的胸部前面最新的主機板,有模有樣的介紹。

    傳統刮鬚刀的刀片要鋒利很多,當然也就刮得更乾淨利落,當前使用的是店家贈送的土耳其derby刀片,比吉列的鋒隱5層刀片還要更銳利一些,刮鬚的動作如果太過粗糙就比較容易刮出血來,但認真細膩的刮就不會,真是一個極好的脾氣檢測儀。

    每個國家的刀片都買了一種,一盒五片,感覺以我的使用頻率,大概要半年才能用完五片,還有一盒日本的在路上,三十五片,這是要用三年才會用完的節奏,平均每片價格十五塊,每個月都換一片的話,三個月成本四十五塊,確實比吉列鋒隱便宜多了,但是我發現俄羅斯的Astra其實已經被吉列收購,且是印度工廠生產的,也許是因為烏俄戰爭,俄羅斯根本沒法出口吧,P&G真是無處不在的托拉斯。

    昨天是萬安演習,所以早早的就去買了便當,要不然據說會被警察攔在半路上,亂跑還會罰款,但是防空警報只響了一分鐘,這是不是太敷衍了。

    今天颱風來了呢,昨天晚上還在考慮到底要不要去公司拿筆電回來,看到停班停課的通知一個接一個,全聯也被搶空,還是上樓去拿了回來,星圖上看起來很大一個颱風,但是巷弄裡面的風,並沒有那麼明顯,大概就是連著下幾天的雨吧,日月潭的蛙蛙們不要想露頭啦!

  • Compile latest redis on Amazon Linux 2023 and configure with systemd

    因為AL2023 默認repo內只有redis6 沒有redis7,所以很多人都希望可以自行安裝redis7,但編譯安裝後主要的問題是無法自啟動,本文主要解決自啟動的問題。

    獲取並安裝必要的組件:

    dnf install openssl-devel gcc tcl systemd-devel -y
    wget http://download.redis.io/redis-stable.tar.gz
    tar zxf redis-stable.tar.gz
    cd redis-stable

    compile 時需要加入systemd的支持:

    make BUILD_TLS=yes USE_SYSTEMD=yes
    make test
    make install

    編輯一下默認的配置文件:

    vi redis.conf

    pidfile /var/run/redis/redis_6379.pid
    dir /var/db/redis

    cp redis.conf /etc/

    添加必要的OS level user

    groupadd redis
    useradd -g redis redis

    edit the amazon linux version redis6 startup service file and copy to /etc/systemd/system/redis.service:

    —我是分割線—

    [Unit]
    Description=Redis persistent key-value database
    After=network.target
    After=network-online.target
    Wants=network-online.target
    [Service]
    ExecStart=/usr/local/bin/redis-server /etc/redis.conf --daemonize no --supervised systemd
    ExecStop=/usr/libexec/redis-shutdown
    Type=notify
    User=redis
    Group=redis
    RuntimeDirectory=redis
    RuntimeDirectoryMode=0755
    [Install]
    WantedBy=multi-user.target

    —我是分割線—

    edit the amazon linux version redis6 shutdown script and copy to /usr/libexec/redis-shutdown:

    —我是分割線—

    #!/usr/bin/bash
    #
    # Wrapper to close properly redis and sentinel
    test x"$REDIS_DEBUG" != x && set -x
    REDIS_CLI=/usr/local/bin/redis-cli
    # Retrieve service name
    SERVICE_NAME="$1"
    if [ -z "$SERVICE_NAME" ]; then
       SERVICE_NAME=redis
    fi
    # Get the proper config file based on service name
    CONFIG_FILE="/etc/$SERVICE_NAME.conf"
    # Use awk to retrieve host, port from config file
    HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
    PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
    PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
    SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
    # Just in case, use default host, port
    HOST=${HOST:-127.0.0.1}
    if [ "$SERVICE_NAME" = redis ]; then
        PORT=${PORT:-6379}
    else
        PORT=${PORT:-26739}
    fi
    # Setup additional parameters
    # e.g password-protected redis instances
    [ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"
    # shutdown the service properly
    if [ -e "$SOCK" ] ; then
        $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
    else
        $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
    fi

    —我是分割線—

    chmod 755 /usr/libexec/redis-shutdown

    reboot instance to test and enjoy!