Hari ini aku baru sahaja deploy satu script untuk aku sentiasa update AWS Security Group ( AWS SG ) dengan dynamic IP. Script ini akan di’execute” setiap minit menggunakan cron supaya AWS SG akan sentiasa dikemaskini dengan IP yang terbaru. Ini juga demi mengelakkan sebarang kehilangan data berlaku.
Script ini bukan aku yang bina tetapi aku dapat dari pengkongsian di reddit dan juga GitHub. Kedua-dua script adalah sama sebenarnya dan aku memilih script ini supaya tidak berlaku penambahan dynamic IP di AWS SG. Objektif seharusnya adalah replace IP yang ada.
Jadi server / device yang akan digunakan untuk mengemaskini IP ini perlu mempunyai command AWS dan sekiranya tidak ada, perlu dipasang dan perlu dipastikan untuk anda generate AWS Access Key ID & juga AWS Secret Key.
Dinasihatkan juga supaya guna python3.7 ke atas sebabnya, yang versi 3.4 & 3.5 juga telah ditamatkan pada 2/1/2021.
Warning - rujukan sini. As of 2/1/2021 Python 3.4 and 3.5 is deprecated. Python 2.7 was deprecated by the Python Software Foundation on January 1, 2020. Going forward, customers using the AWS CLI version 1 should transition to using Python 3, with a minimum of Python 3.6. Python 2.7 support is deprecated for new versions of the AWS CLI version 1 starting 7/19/2021. In order to use the AWS CLI version 1 with an older version of Python, you need to install an earlier version of the AWS CLI version 1. To view the AWS CLI version 1 Python version support matrix, see About the AWS CLI versions. Rujukan yang aku guna untuk memasang Pythong 3.7 dan memasang AWS CLI rujukan 1 rujukan 2
Apabila selesai dengan item di atas, boleh terus ke langkah seterusnya.
Di bawah adalah cron yang aku gunakan untuk aku kemaskini dynamic IP di AWS SG untuk setiap 1 minit.
*/1 * * * * root /opt/scripts/dynamic_aws_sg_access.sh <sg-id> <port>
Sekiranya cron yang anda buat berjaya tetapi AWS SG anda tidak dikemaskini, anda perlu semak dalam maillog anda. Isu ini aku alami sebentar tadi dan puncanya sebab aws command tidak berada di dalam environment. Jadi aku update script dynamic_aws_sg_access.sh supaya ia menggunakan full path command ke aws.
Ini contoh error di dalam maillog yang aku alami tadi.
From root@db.localdomain Sun Mar 28 14:11:01 2021 Return-Path: <root@db.localdomain> X-Original-To: root Delivered-To: root@db.localdomain Received: by db.localdomain (Postfix, from userid 0) id 9A167400EA38; Sun, 28 Mar 2021 14:11:01 +0800 (+08) From: "(Cron Daemon)" <root@db.localdomain> To: root@db.localdomain Subject: Cron <root@db> bash /root/dynamic_aws_sg_access.sh <sg-id> <port> Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated Precedence: bulk X-Cron-Env: <XDG_SESSION_ID=1036> X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0> X-Cron-Env: <LANG=en_US.UTF-8> X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> Message-Id: <20210328061101.9A167400EA38@db.localdomain> Date: Sun, 28 Mar 2021 14:11:01 +0800 (+08) /root/dynamic_aws_sg_access.sh: line 47: aws: command not found [ERROR] Failed to retrieve SSH ingress rules for sg-id
Jika diperhatikan, pada baris 47, cron tidak dapat menggunakan command aws. Jadi kita bantu dengan meletakkan full path command aws seperti berikut.
34 allowed_cidrs="$(/usr/local/bin/aws ec2 describe-security-groups \ 35 --output text \ 36 --query ' 37 SecurityGroups[? 38 GroupId==`'${group_id}'` 39 ]. 40 [ 41 IpPermissions[? 42 ToPort==`'${port}'` && FromPort==`'${port}'` && IpProtocol==`tcp` 43 ]. 44 IpRanges[*]. 45 CidrIp 46 ]' \ 47 || echo "Failed")";
Perhatikan pada baris 34, aku letak directory penuh sampai ke command aws. Harap dengan perkongsian ini dapat membantu anda.