作者 |
主題 |
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 1 篇) 【原創】amazon aws 學習筆記
一。將資料 sync 上傳到 AWS S3 並且預設為分享
1.首先使用主帳號登入開啟一個只允許存取 S3 的帳號,記下帳號與密碼
2.建立一個 Buckets (儲存桶) 名稱我們暫定 test ,上傳檔案 test.txt
使用 EC2 裡的 Linux 為範例
3.下載S3存取工具與安裝
yum install -y unzip
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
檢查版本號確認安裝是否成功
/usr/local/bin/aws --version
> aws-cli/1.10.11 Python/2.6.6 Linux/2.6.32-573.18.1.el6.centos.plus.x86_64 botocore/1.4.2
4.設定存取 S3 的設定值
aws configure
> AWS Access Key ID [None]: ******
> AWS Secret Access Key [None]: ***********
> Default region name [None]: us-west-2 #依你的 EC2 所在區域設定
> Default output format [None]:
5.測試是否可以列出 S3
aws s3 ls
> 2016-03-10 00:14:27 test
6.使用 sync 將本機 test 資料夾內全部的內容上傳到 test Buckets (儲存桶) 內,並且開所有人都可以存取
aws s3 sync /test/ s3://test --delete --exclude ".Sync*" --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
如果是備份檔案可以加上 --storage-class 改變儲存的標準 這裡看定價 https://aws.amazon.com/tw/s3/pricing/
預設是標準儲存 前 1 TB / 月 $0.0300 每 GB
標準低頻率訪問儲存 前 1 TB / 月 $0.0125 每 GB
--storage-class STANDARD_IA
低冗餘儲存 前 1 TB / 月 $0.0240 每 GB
--storage-class REDUCED_REDUNDANCY
7.連線方式
未開啟靜態託管 Static Website Hosting
https://s3-us-west-2.amazonaws.com/test/test.txt
開啟靜態託管 Static Website Hosting
https://test.s3-website-us-west-2.amazonaws.com/test.txt
通常目錄都不會開 list 權限,所以只連目錄沒指定檔案名稱的話會是 Access Denied
查看支援指令說明
aws s3 help
[*]cp (複製檔案)
[*]ls (列出檔案)
[*]mb (建立 bucket)
[*]mv (搬移檔案)
[*]rb (刪除bucket)
[*]rm (刪除檔案)
[*]sync (本地端與bucket或是bucket與bucket之間同步)
[*]website (bucket用作網站的設定)
檢查儲存桶資料
aws s3 ls s3://test
上傳資料並且開啟任何人分享
aws s3 cp test.txt s3://test --acl public-read
刪除檔案
aws s3 rm s3://test/test.txt
延伸閱讀
Zeroplex 生活隨筆
http://blog.zeroplex.tw/2014/04/aws-s3.html
瓶中封裝的那些時光
http://tiab.brecht.im/using-s3-upload-files-from-bash/
Website Hosting 的差異性
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/WebsiteEndpoints.html
本帖由dc最後編輯於2016-04-26 10:03
Your mind to my mind,
your thought to my thought |
發表時間:2016-03-11 10:21 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 2 篇) 【原創】二。開啟第二張網卡與AZ互通
主要是因為 EC2 eth0 的 Private IP 是用來 NAT Public IP 使用,為了要分出內網與外網的流量所以必須增加 eth1 來分別記錄。
文件都說同一個 VPC 或是同一個 AZ 內網都是相通的,但是新增第二張網卡後會遇到一些問題所以來做一下筆記。
需要注意一點同一台 實例(Instances) 如果綁了兩張網卡,如果之前有綁定 彈性IP(Elastic IPs) 的話當取消 彈性IP 時會拿不到分配的 Public IP,必須分離(Deatch) 第二張網卡才能取得自動分配的 Public IP 。
或是 VPC 子網(Subnet) 裡的 修改自動分配公有IP(Modify Auto-Assign Public IP) 裡不要開 啟預自動分配公有IP(Enable auto-assign Public IP)。
假設我們的 實例(Instances) VM 分別在 可用區(Availability Zone) 中的 us-west-2a 與 us-west-2b
[*]1.VPC 創建子網 (Create Subnet)
給 us-west-2a 使用的
Name tag : eth1a
VPC : 選你的VPC
Availability Zone : us-west-2a
CIDR block : 172.31.50.0/27 範例照你自己的需求
給 us-west-2b 使用的
Name tag : eth1b
VPC : 選你的VPC
Availability Zone : us-west-2b
CIDR block : 172.31.50.32/27 範例照你自己的需求
[*]2.VPC 創建安全組 (Create Security Group)
Name tag : eth1
Group name : eth1
Description : eth1
VPC : 選你的VPC
Edit 入站規則(Inbound Rules) 與 出站規則(Outbound Rules)
所有流量(ALL Traffic)
Source 選擇剛剛建立的 eth1 Group ID
只允許該網卡互通
[*]3.EC2 網路接口(Network Interfaces) 建立與綁定網卡
創建網路接口(Create Network Interfaces)
Subnet : 分 us-west-2a 與 us-west-2b 來建立
Private IP : 可以留空自動分配
Security groups : 選擇剛剛建立的 eth1
將剛剛建立 狀態(Status) 為 available 的 網路接口(Network Interfaces) 上按右鍵 附加 (Attach) 到同一可用區(Availability Zone) 的 實例(Instance ID)
[*]4.網卡(Interfaces) 細部設定
需登入 VM 裡依 Linux 為範例
Attach Network Interfaces 前與 Attach Network Interfaces 後使用
ifconfig -a
可以看出多了 eth1 的網卡,這時候先設定預設的 GATEWAY 上去,不然啟動 eth1 時就連不進來只能拔掉 eth1 然後重新開機了。
vi /etc/sysconfig/network
GATEWAYDEV=eth0
增加 eth1 設定值
vi /etc/sysconfig/network-scripts/ifcfg-eth1
ONBOOT=yes
DEVICE=eth1
BOOTPROTO=dhcp
在來是 eth1 route 的設定,讓走 eth1 的網路走 eth1 出去不要繞到 eth0 的 gateway 出去,不然還是一樣不通
Availability Zone : us-west-2a CIDR block : 172.31.50.0/27 的 gateway 是 172.31.50.1
Availability Zone : us-west-2b CIDR block : 172.31.50.32/27 的 gateway 是 172.31.50.33
#if az us-west-2a
echo 172.31.50.0/24 via 172.31.50.1 dev eth1 > /etc/sysconfig/network-scripts/route-eth1
cat /etc/sysconfig/network-scripts/route-eth1
#if az us-west-2b
echo 172.31.50.0/24 via 172.31.50.33 dev eth1 > /etc/sysconfig/network-scripts/route-eth1
cat /etc/sysconfig/network-scripts/route-eth1
ifup eth1
然後互 ping 或是 ssh us-west-2a 與 us-west-2b 互通~大功告成~收工~
Ubuntu 18.04.4 LTS 新增 route 的方式不太一樣,並放上 (第 8 篇) 如何跨國讀取 ElastiCache 的 Redis ? 兩張網卡的範例
例如
eu-west-1a
test01-eth0 172.31.60.11
test01-eth1 172.31.61.11
eu-west-1b
test02-eth0 172.31.62.11
test02-eth1 172.31.63.11
ap-southeast-1b
ElastiCache 的 Redis ip 區段為 10.1.4.0/24
test01 與 test02 走網卡 eth1 互連,與 跨國的 Redis 連線也走 eth1
vi /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [172.31.60.11/24]
routes:
- to: 0.0.0.0/0
via: 172.31.60.1
metric: 30
optional: true
match:
macaddress: 0a:0b:0c:0d:0e:9c
set-name: eth0
eth1:
dhcp4: no
addresses: [172.31.61.11/24]
routes:
- to: 172.31.61.0/24
via: 172.31.61.1
metric: 20
- to: 172.31.63.0/24
via: 172.31.61.1
metric: 10
- to: 10.1.4.0/24
via: 172.31.61.1
metric: 25
optional: true
match:
macaddress: 1a:1b:1c:1d:1e:de
set-name: eth1
本帖由dc最後編輯於2020-05-27 12:03
Your mind to my mind,
your thought to my thought |
發表時間:2016-03-11 17:14 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 3 篇) 【原創】關於建立 VPC 的注意事項
在官網 VPC 的解釋如下
https://aws.amazon.com/tw/vpc/
Amazon Virtual Private Cloud (Amazon VPC) 允許您在 Amazon Web Services (AWS) 雲端佈建一個在邏輯上隔離的部分,並在自己定義的虛擬網路中啟動 AWS 資源。您可以完全掌控虛擬聯網環境,包括選擇自己的 IP 地址範圍、建立子網路,以及配置路由表和網路閘道。
您可以輕鬆自訂 Amazon Virtual Private Cloud 的網路配置。例如,您可以為可存取網路的 Web 伺服器建立公有子網路,而將資料庫或應用程式伺服器等後端系統放在不能存取網路的私有子網路中。您可以利用安全群組和網路存取控制清單等多種安全層,對各個子網路中 Amazon EC2 執行個體的存取進行控制。
所以在 AWS 上如果要區隔 開發環境 與 測試環境 我會建議建立不同的 VPC 來區隔~
但是自己建立的 VPC 因為設定值都要手動來所以需要注意一下,要添加 Internet Gateway 與路由才能連得上與配發公有 IP
Your VPCs -> Create VPC 建立完畢之後需要, Subnets -> Create Subnet 注意 Availability Zone 不同 AZ 建立不同網段,Internet Gateways -> Create Internet Gateway 創建完成後 右鍵 Attach to VPC 將對外的 Gateway 附加上去,Rouet Tables -> 選擇剛剛建立的 VPC 路由 -> Routes -> Edit -> Add another route -> 0.0.0.0/0 選剛剛建立的 Gateway -> Save
您的 VPC -> 創建 VPC 建立完畢之後需要, 子網 -> 創建子網 注意 可用區 不同 AZ 建立不同網段,Internet 網關 -> 創建 Internet 網關 創建完成後 右鍵 附加到 VPC 將對外的 Gateway 附加上去,路由表 -> 選擇剛剛建立的 VPC 路由 -> 路由 -> 編輯 -> 添加其他路由 -> 0.0.0.0/0 選剛剛建立的 Gateway -> 保存
Your mind to my mind,
your thought to my thought |
發表時間:2016-10-12 15:58 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 4 篇) 【原創】ElastiCache 手動備份排程
ElastiCache 雖然有自動備份的功能~但是不太靈活~因為我需要每六小時備份一次沒辦法這樣設定。
所以就使用 AWS CLI 來跑備份~
先上排程的 sh 在來解釋會寫 log 來記錄
代碼: |
#定義參數
BACKUP="這裡填要備份的節點ID 也就是 Node Name 通常會使用 002 這一個"
BACKUPDAY=$(date +"%Y%m%d-%H%M%S")
BACKUPNAME=$BACKUP-$BACKUPDAY
BUCKET="這裡填放備份的儲存桶名稱 也就是 BUCKET"
RUNLOG="這裡填紀錄的 log 絕對路徑名稱與檔名"
echo "" >> $RUNLOG
echo "Backup Redis Start" $(date +"%Y%m%d %H:%M:%S") >> $RUNLOG
#echo $BACKUPNAME
echo "$BACKUPNAME" >> $RUNLOG
#echo "aws elasticache create-snapshot --cache-cluster-id" $BACKUP "--snapshot-name" $BACKUPNAME
echo "aws elasticache create-snapshot --cache-cluster-id" $BACKUP "--snapshot-name $BACKUPNAME" >> $RUNLOG
#執行快照備份作業
/usr/local/bin/aws elasticache create-snapshot --cache-cluster-id $BACKUP --snapshot-name $BACKUPNAME
#每 90 秒檢查是否備份完成,完成後在進行下一步
createtype=`/usr/local/bin/aws elasticache describe-snapshots --snapshot-name $BACKUPNAME --output text | awk '{print $17}'`
#echo $createtype
until [ "$createtype" = "available" ]
do
createtype=`/usr/local/bin/aws elasticache describe-snapshots --snapshot-name $BACKUPNAME --output text | awk '{print $17}'`
#echo $createtype
echo $createtype >> $RUNLOG
sleep 90s
done
sleep 30s
#echo "Create Status Available, Next..." $(date +"%Y%m%d %H:%M:%S")
echo "Create Status Available, Next Copy Snapshot To S3" $(date +"%Y%m%d %H:%M:%S") >> $RUNLOG
#echo "/usr/local/bin/aws elasticache copy-snapshot --source-snapshot-name" $BACKUPNAME "--target-snapshot-name" $BACKUPNAME "--target-bucket" $BUCKET
echo "/usr/local/bin/aws elasticache copy-snapshot --source-snapshot-name" $BACKUPNAME "--target-snapshot-name" $BACKUPNAME "--target-bucket" $BUCKET >> $RUNLOG
#將備份的檔案複製到 S3 的儲存桶 BUCKET
/usr/local/bin/aws elasticache copy-snapshot --source-snapshot-name $BACKUPNAME --target-snapshot-name $BACKUPNAME --target-bucket $BUCKET
#複製完後要等到狀態變成 available 才能往下進行刪除
waittype=`/usr/local/bin/aws elasticache describe-snapshots --snapshot-name $BACKUPNAME --output text | awk '{print $17}'`
#echo $waittype
until [ "$waittype" = "available" ]
do
waittype=`/usr/local/bin/aws elasticache describe-snapshots --snapshot-name $BACKUPNAME --output text | awk '{print $17}'`
#echo $waittype
echo $waittype >> $RUNLOG
sleep 60s
done
sleep 30s
echo "Delete Snapshot" $BACKUPNAME $(date +"%Y%m%d %H:%M:%S") >> $RUNLOG
echo "/usr/local/bin/aws elasticache delete-snapshot --snapshot-name" $BACKUPNAME >> $RUNLOG
#刪除已經備份到 S3 儲存桶的快照備份
/usr/local/bin/aws elasticache delete-snapshot --snapshot-name $BACKUPNAME
echo "Backup Redis Over" $(date +"%Y%m%d %H:%M:%S") >> $RUNLOG
|
log 內容
代碼: |
Backup Redis Start 20180209 06:00:01
這裡會顯示NodeName-20180209-060001
aws elasticache create-snapshot --cache-cluster-id 這裡會顯示NodeName --snapshot-name 這裡會顯示NodeName-20180209-060001
creating
creating
creating
creating
creating
creating
creating
creating
creating
creating
creating
creating
creating
creating
creating
available
Create Status Available, Next Copy Snapshot To S3 20180209 06:24:49
/usr/local/bin/aws elasticache copy-snapshot --source-snapshot-name 這裡會顯示NodeName-20180209-060001 --target-snapshot-name 這裡會顯示NodeName-20180209-060001 --target-bucket 這裡會顯示儲存桶名稱也就是BUCKET
exporting
available
Delete Snapshot 這裡會顯示NodeName-20180209-060001 20180209 06:27:24
/usr/local/bin/aws elasticache delete-snapshot --snapshot-name 這裡會顯示NodeName-20180209-060001
Backup Redis Over 20180209 06:27:25
|
整個備份的流程為
[*]先建立備份
aws elasticache create-snapshot --cache-cluster-id 這裡會顯示NodeName --snapshot-name 這裡會顯示NodeName-20180209-060001
[*]確認備份狀態後進行備份到 S3
aws elasticache describe-snapshots --snapshot-name 這裡會顯示NodeName-20180209-060001 | grep "SnapshotStatus"
"SnapshotStatus": "creating", 變成 "SnapshotStatus": "available",
[*]在備份到 s3
aws elasticache copy-snapshot --source-snapshot-name 這裡會顯示NodeName-20180209-060001 --target-snapshot-name 這裡會顯示NodeName-20180209-060001 --target-bucket 這裡會顯示儲存桶名稱也就是BUCKET
[*]確認複製狀態後刪除備份
aws elasticache describe-snapshots --snapshot-name 這裡會顯示NodeName-20180209-060001 | grep "SnapshotStatus"
"SnapshotStatus": "exporting", 變成 "SnapshotStatus": "available",
[*]刪除備份
aws elasticache delete-snapshot --snapshot-name 這這裡會顯示NodeName-20180209-060001
ElastiCache-backup 需要增加 IAM 的策略權限為
"elasticache:CopySnapshot",
"elasticache:CreateSnapshot",
"s3:ListAllMyBuckets",
"s3:GetBucketLocation",
"s3:DeleteObject",
"s3:GetBucketAcl",
"s3:PutObject",
"elasticache:DescribeSnapshots",
"elasticache:DeleteSnapshot"
儲存桶 BUCKET 需要增加該使用者
540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353
會被辨識為 aws-scs-s3-readonly
權限需要開啟
列出對象
寫入對象
讀取存儲桶權限
官方說明
进行手动备份
除了自动备份以外,您还可以随时创建手动 备份。与在指定保留期之后自动删除的自动备份不同,手动备份并没有在超过之后就会自动删除的保留期。您必须手动删除任何手动备份。即使您删除某个集群或节点,该集群或节点的所有手动备份都会保留。如果您不再需要保留某个手动备份,您必须自行显式删除它。
https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/UserGuide/backups-manual.html
示例 2:备份有副本节点的 Redis (已禁用集群模式) 群集
以下 AWS CLI 操作从带有一个或多个只读副本的 Redis (已禁用集群模式) 集群 myNonClusteredRedis 创建备份 bkup-20150515。
对于 Linux, macOS, or Unix:
aws elasticache create-snapshot --cache-cluster-id myNonClusteredRedis-001 --snapshot-name bkup-20150515
描述备份
以下过程演示如何显示备份列表。如果需要,您还可以查看特定备份的详细信息。
https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/UserGuide/backups-describing.html
以下操作使用参数 --snapshot-name 显示备份 my-backup 的详细信息。
aws elasticache describe-snapshots --snapshot-name my-backup
导出 ElastiCache 备份 (AWS CLI)
Amazon ElastiCache 支持将您的 ElastiCache 备份导出到 Amazon Simple Storage Service (Amazon S3) 存储桶,这让您可以从 ElastiCache 之外访问它。您可以使用 ElastiCache 控制台、AWS CLI 或 ElastiCache API 导出备份。
https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/UserGuide/backups-exporting.html#Snapshots.Exporting.CLI
使用带有以下参数的 copy-snapshot CLI 操作将备份导出到 Amazon S3 存储桶:
参数
--source-snapshot-name - 要复制的备份的名称。
--target-snapshot-name - 备份副本的名称。
名称必须在 1 到 1000 个字符之间,并能够以 UTF-8 编码。
ElastiCache 对您在此处输入的值添加实例标识符和 .rdb。例如,如果您输入 my-exported-backup,则 ElastiCache 创建 my-exported-backup-0001.rdb。
--target-bucket - 您要将备份导出到的 Amazon S3 存储桶的名称。在指定存储桶中生成备份的副本。
--target-bucket 必须是备份所在区域内的 Amazon S3 存储桶并具有以下权限,导出过程才能成功。
对象访问 – Read 和 Write。
权限访问 – Read。
有关更多信息,请参阅 步骤 2:将对 ElastiCache 的访问权限授予您的 Amazon S3 存储桶。
以下操作将备份复制到 my-s3-bucket。
对于 Linux, macOS, or Unix:
aws elasticache copy-snapshot --source-snapshot-name automatic.my-redis-primary-2016-06-27-03-15 --target-snapshot-name my-exported-backup --target-bucket my-s3-bucket
(AWS CLI) 删除备份
https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/UserGuide/backups-deleting.html
使用带以下参数的 delete-snapshot AWS CLI 操作删除备份。
--snapshot-name - 要删除的备份的名称。
以下代码删除备份 myBackup。
aws elasticache delete-snapshot --snapshot-name myBackup
Your mind to my mind,
your thought to my thought |
發表時間:2018-02-09 11:44 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 5 篇) 【原創】建立在 S3 裡只有上傳與覆蓋但沒有刪除權限的帳號
說明 | 英文抓圖 | 中文抓圖 |
首先到 IAM -> 策略 | | | 按下創建策略 | | | 列表 讀取 寫入的權限都要開,只是寫入權限不要開 DeleteObject 相關的 | | | 資源與請求條件請依照自己的需求做設定,然後按下右下角的 Review policy | | | 自訂義名稱與描述後按下 Create policy | | | 再來我們到 用戶 -> 添加用戶 | | | 建立使用者有兩種類型,第一種是編程訪問我們這次要用的勾選他,第二種是控制台訪問可以登入S3控制台透過Web介面來管理檔案。這次範例不需要所以不用勾選第二種訪問 -> 右下角 下一步:權限 | | | 權限設定選擇 -> 直接附加現有策略 -> 篩選策略那邊輸入我們剛剛建立的策略名稱 s3test1 -> 勾選之後 下一步:標籤
標籤的部分依需求設定我們直接 下一步:審核
創建用戶 | | |
建立使用者最後的畫面是
要記住這裡的密鑰 ID 與 密碼 待會使用
安裝 aws cli 與輸入帳密的方式請看第一篇文章就不再詳述了
我們建立一個測試檔案
vi test1.txt
2018/12/24 01
上傳並開啟分享 (要修改權限的話要多開 PutObjectAcl 這個權限喔)
aws s3 cp test1.txt s3://test-20181130 --acl public-read
upload: ./test1.txt to s3://test-20181130/test1.txt
使用瀏覽器連線
https://s3-ap-southeast-1.amazonaws.com/test-20181130/test1.txt
可以看到是
2018/12/24 01
我們在編輯一下加上 02
vi test1.txt
2018/12/24 01
2018/12/24 02
上傳並開啟分享
aws s3 cp test1.txt s3://test-20181130 --acl public-read
使用瀏覽器連線
https://s3-ap-southeast-1.amazonaws.com/test-20181130/test1.txt
可以看到是
2018/12/24 01
2018/12/24 02
但是如果我們下刪除指令的話會被拒絕
aws s3 rm s3://test-2018113/test1.txt
delete failed: s3://test-20181130/test1.txt An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
所以有什麼特殊需求的話自定義策略就可以囉~
本帖由dc最後編輯於2018-12-24 15:38
Your mind to my mind,
your thought to my thought |
發表時間:2018-11-30 10:51 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 6 篇) 【原創】如何建立網域對應的 S3 儲存桶呢?
例如我們想用這個 s3.omega.idv.tw 網域對應 logo 圖片
http://s3.omega.idv.tw/dclogo.gif
這還沒設定完成時連線會出現 無法訪問這個網站
在 S3 建立 s3.omega.idv.tw 這個儲存桶,進入建立的儲存桶 -> 屬性 -> 靜態網站託管 -> 使用此儲存桶託管網站 -> 索引文檔填入 index.html -> 保存
上傳 dclogo.gif 並開啟用公用訪問權限
此時
http://s3-ap-southeast-1.amazonaws.com/s3.omega.idv.tw/dclogo.gif
或
http://s3.omega.idv.tw.s3.amazonaws.com/dclogo.gif 會自動跳轉到 http://s3.omega.idv.tw.s3-ap-southeast-1.amazonaws.com/dclogo.gif
都確認可以開啟檔案後,在 DNS 上 CNAME s3 到 s3.omega.idv.tw.s3-ap-southeast-1.amazonaws.com
之後使用 http://s3.omega.idv.tw/dclogo.gif 就可以存取到檔案囉~
本帖由dc最後編輯於2018-12-24 16:13
Your mind to my mind,
your thought to my thought |
發表時間:2018-12-24 16:13 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 7 篇) 關閉程式前退出 ELB 程式開啟後註冊 ELB
Load Balancer 要搭配 Target Groups 的話都是新一代的,先寫上一代的教學。
首先我們要先決定,進退 ELB 是透過一台 Gate 機統一去做?還是各自的 SERVER
安裝 aws cli 並安裝對應權限的 iam 去做?教學兩個都會提到。
範例為 Webserver pm2
事前作業
每一台 SERVER 都需要安裝 ec2-metadata,目的是要取得 ec2 Instances ID
因為進退 ELB 要使用 Instances ID
代碼: | sudo su -
cd /usr/bin/
wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
ls -l ec2-metadata
chmod u+x ec2-metadata
chmod 755 ec2-metadata
ls -l ec2-metadata
/usr/bin/ec2-metadata -i | awk '{print $2}'
exit |
上一代的 Classic Load Balancer
[*]IAM ELB 權限
ELB
讀取 DescribeInstanceHealth
寫入 DeregisterInstancesFromLoadBalancer
寫入 RegisterInstancesWithLoadBalancer
[*]安裝 aws cli 讓 Server 可以自行進退 ELB
yum install -y unzip
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
/usr/local/bin/aws --version
aws configure
> AWS Access Key ID [None]: 上一步建立有 elb 權限的 iam
> AWS Secret Access Key [None]: 上一步建立有 elb 權限的 iam
> Default region name [None]: ap-southeast-1
> Default output format [None]:
cat ~/.aws/credentials
[*]先退出 elb 後 kill pm2 service,啟動 pm2 service 之後註冊 elb
代碼: | lbname="Load Balancers Name"
InstanceID=`/usr/bin/ec2-metadata -i | awk '{print $2}'`
#echo $InstanceID 取得該伺服器的 InstanceID
InstanceStates=`/usr/local/bin/aws elb describe-instance-health --load-balancer-name $lbname --output text`
#echo $InstanceStates 取得該 Load Balancers 所有 InstanceID 的健康狀態
InstanceStatesforID=`/usr/local/bin/aws elb describe-instance-health --load-balancer-name $lbname --output text | grep "$InstanceID" | awk '{print $5}'`
#echo $InstanceStatesforID 取得指定的 InstanceID 健康狀態
/usr/local/bin/aws elb deregister-instances-from-load-balancer --load-balancer-name $lbname --instances $InstanceID
#指定的 InstanceID 退出 elb
while [ "$InstanceStatesforID" = "InService" ]
do
InstanceStatesforID=`/usr/local/bin/aws elb describe-instance-health --load-balancer-name $lbname --output text | grep "$InstanceID" | awk '{print $5}'`
#重複取得指定的 InstanceID 健康狀態,一直到為非服務中才跳出迴圈 InService 為服務中
echo "Closeing $InstanceID $(hostname)"
done
echo "Closs $InstanceID $(hostname) OK"
echo "cd /home/dc/prod/web"
cd /home/dc/prod/web
echo "sudo pm2 kill"
sudo pm2 kill
#到指定的目錄裡下 sudo pm2 kill 指令
onlinenum=`sudo pm2 list | awk '{print $10}' | grep "online" -c`
#echo $onlinenum 確認線程為 0 後才跳出迴圈
until [ "$onlinenum" = "0" ]
do
onlinenum=`sudo pm2 list | awk '{print $10}' | grep "online" -c`
echo "online $onlinenum"
done
echo "sudo pm2 start process_production.json"
sudo pm2 start process_production.json
#echo $onlinenum 啟動後確認線程為 10 後才跳出迴圈
until [ "$onlinenum" = "10" ]
do
onlinenum=`sudo pm2 list | awk '{print $10}' | grep "online" -c`
echo "online $onlinenum"
done
#如果你的程式線程開啟完畢之後,log 裡有紀錄特殊字元代表程式開啟完畢的話
sleep 10s
restout=`tail -n 2 /data/pm2/web-out.log | grep "start end" -c`
echo "web-out log $webout"
until [ "$webout" = "1" ]
do
restout=`tail -n 2 /data/pm2/web-out.log | grep "start end" -c`
echo "web-out log $webout"
done
/usr/local/bin/aws elb register-instances-with-load-balancer --load-balancer-name $lbname --instances $InstanceID
#指定的 InstanceID 註冊 elb
InstanceStatesforID2=`/usr/local/bin/aws elb describe-instance-health --load-balancer-name $lbname --output text | grep "$InstanceID" | awk '{print $10}'`
#echo $InstanceStatesforID2 重複取得指定的 InstanceID 健康狀態,一直到為服務中才跳出迴圈 OutOfService 為非服務中
while [ "$InstanceStatesforID2" = "OutOfService" ]
do
InstanceStatesforID2=`/usr/local/bin/aws elb describe-instance-health --load-balancer-name $lbname --output text | grep "$InstanceID" | awk '{print $10}'`
echo "Opening $InstanceID $(hostname)"
done
echo "Open $InstanceID $(hostname) OK" |
現在的 Network Load Balancer
[*]IAM ELB 權限
ELB
讀取 DescribeTargetHealth
寫入 DeregisterTargets
寫入 RegisterTargets
[*]只在 Gate 機上安裝 aws cli v2 版進退 ELB
yum install -y unzip
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
/usr/local/bin/aws2 --version
aws-cli/2.0.0dev4 Python/3.7.3 Linux/4.15.0-1058-aws botocore/2.0.0dev3
/usr/local/bin/aws2 configure
AWS Access Key ID [None]: 上一步建立有 elb 權限的 iam
AWS Secret Access Key [None]: 上一步建立有 elb 權限的 iam
Default region name [None]: ap-southeast-1
Default output format [None]:
cat ~/.aws/credentials
[*]只在 Gate 機上執行,所以 ssh 的權限與 kill pm2 的權限要自己先設定好,統一退出 elb 後 kill pm2 service,啟動 pm2 service 之後註冊 elb
$destination 是要重啟的 Server ip 清單
reload.sh 是我自己寫的 sh 後面接 stop 是關閉程式,接 restart 是重啟程式
代碼: | targetarn="Target group ARN"
port1="443"
port2="1234"
echo -e "\e[1;44m 現在開始要執行安全重啟 $destination 進退 ELB \e[0m"
pause '請按任意鍵繼續...'
for HOST in $destination;
do
echo -e "\e[1;35m $HOST SERVER :\e[0m"
InstanceID=`ssh web@$HOST /usr/bin/ec2-metadata -i | awk '{print $2}'`
#echo $InstanceID
InstanceStates=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep $InstanceID`
#echo $InstanceStates
InstanceStatesforID=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep "$InstanceID" | awk '{print $2}'`
#echo $InstanceStatesforID
if [ "$InstanceStatesforID" = "healthy" ]
then
/usr/local/bin/aws2 elbv2 deregister-targets --target-group-arn $targetarn --targets Id=$InstanceID,Port=$port1 Id=$InstanceID,Port=$port2
sleep 5s
InstanceStatesforID1=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep "$InstanceID" | awk '{print $2}'`
while [ "$InstanceStatesforID1" = "draining" ]
do
InstanceStatesforID1=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep "$InstanceID" | awk '{print $2}'`
echo "Closeing $InstanceID $HOST"
sleep 5s
done
echo "Closs $InstanceID $HOST OK"
fi
echo -e "\e[1;44m 現在要開始 Restart $HOST \e[0m"
echo "ssh web@$HOST /bin/bash /home/dc/reload.sh restart"
ssh web@$HOST /bin/bash /home/dc/reload.sh restart
/usr/local/bin/aws2 elbv2 register-targets --target-group-arn $targetarn --targets Id=$InstanceID,Port=$port1 Id=$InstanceID,Port=$port2
sleep 5s
InstanceStatesforID2=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep "$InstanceID" | awk '{print $2}'`
while [ "$InstanceStatesforID2" = "initial" ]
do
InstanceStatesforID2=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep "$InstanceID" | awk '{print $2}'`
echo "Opening $InstanceID $HOST"
sleep 5s
done
InstanceStatesforID3=`/usr/local/bin/aws2 elbv2 describe-target-health --target-group-arn $targetarn --query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output text | grep "$InstanceID" | awk '{print $2}'`
if [ "$InstanceStatesforID3" = "healthy" ]
then
echo "Open $InstanceID $HOST OK"
fi
echo -e "\e[1;33m--------------------------------------------------------------------------------\e[0m"
done
echo -e "\e[1;31mDone.\e[0m" |
本帖由dc最後編輯於2020-04-06 16:50
Your mind to my mind,
your thought to my thought |
發表時間:2020-04-06 15:43 |
|
dc
管理員
性別:男
來自:瓦肯星
發表總數:10723
註冊時間:2002-05-07 16:32 |
(第 8 篇)
如何跨國讀取 ElastiCache 的 Redis ?
目前的案例是伺服器都架設在新加坡,但是離新加坡太遠的國家連線會 lag,該服務只是需要連線 Redis 撈取必要資訊。
官方文件 給的方式為 vpc 對等連接 (Peering Connections)
在不同區域中存取與 Amazon EC2 執行個體位於不同 Amazon VPC 的 ElastiCache 叢集
https://docs.aws.amazon.com/zh_tw/AmazonElastiCache/latest/red-ug/elasticache-vpc-accessing.html#elasticache-vpc-accessing-different-vpc-different-region
在您帳戶中的兩個 VPC 之間創建 VPC 對等連接
https://docs.aws.amazon.com/zh_cn/vpc/latest/peering/create-vpc-peering-connection.html
也就是 VPC 與 VPC 互連,並設定路由表之後就可以串起來了~
搜尋網路上舊的文章有設定 nat 隧道 vpn 等等的都不需要~現在只需要
1. 設定 vpc 對等連接
2. 設定路由表
3. 設定安全組
三個步驟就能跨國連線了~
我們假設 redis 在新加坡 vpc名稱為 vpc-123,要連線的伺服器在歐洲-愛爾蘭 vpc名稱為 vpc-456
1. 設定 vpc 對等連接
先在 歐洲-愛爾蘭
VPC -> VIRTUAL PRIVATE CLOUD -> Peering Connections -> Create Peering Connection
Peering connection name tag : 填寫自訂名稱
本地端 VPC
VPC (Requester)* : 選擇 vpc-456
另一端 VPC
Region 單選 Another Region 選擇 亞洲-新加坡
VPC (Accepter)* : 填入 vpc-123
按下 Create Peering Connection 後
到 亞洲-新加坡
VPC -> VIRTUAL PRIVATE CLOUD -> Peering Connections
可以看到 歐洲-愛爾蘭 發出的 對等連接 請求,選擇他之後 Actions -> Accept Requert
但還是要設定路由表兩邊才連線的起來~
2. 設定路由表
歐洲-愛爾蘭
VPC -> VIRTUAL PRIVATE CLOUD -> Route Tables
選擇該 vpc 的路由表 Route Table -> Routes -> Edit routes
Add route -> Target -> Peering Connection ->
他會撈出 vpc 對等連接 pcx-xxxx 選我們剛剛建立的那個
Destination 填 亞洲-新加坡 redis 的 IP 區段後 按下 Save routes
亞洲-新加坡
VPC -> VIRTUAL PRIVATE CLOUD -> Route Tables
選擇該 vpc 的路由表 Route Table -> Routes -> Edit routes
Add route -> Target -> Peering Connection ->
他會撈出 vpc 對等連接 pcx-xxxx 選我們剛剛同意的那個
Destination 填 歐洲-愛爾蘭 ec2 的 IP 區段後 按下 Save routes
3. 設定安全組
因為是從 歐洲-愛爾蘭 ec2 連線到 亞洲-新加坡 redis
所以只要在 亞洲-新加坡 redis 使用的安全組加上 歐洲-愛爾蘭 ec2 的 private IPv4 IP 就能連線囉!
不是 Public IP 不要開錯了~
如果你有在 ec2 開兩張網卡如
>> (第 2 篇) 【原創】二。開啟第二張網卡與AZ互通
那記得在 ec2 裡 route 裡設定 亞洲-新加坡 的 ip 區段走第二張網卡出去
安全組裡的 private IP 也要修改成對應的~
本帖由dc最後編輯於2020-05-27 11:49
Your mind to my mind,
your thought to my thought |
發表時間:2020-05-26 17:24 |
|
所有時間均為GMT+8, 現在是2024-04-20 16:13 |