Bash

如何使用 shell 腳本自動化 aws cli 命令

  • August 5, 2022

我想知道任何人都可以幫助我製作一個自動化 aws cli 程序的 shell 腳本:

1.創建安全組

2.設置角色為本安全組的22埠和80埠

3.用這個安全組創建一個ec2實例。

我做了一些事情,但還沒有完全完成。

addSG=$ aws ec2 create-security-group --group-name plamenSG --description "Security group for SSH access" --vpc-id vpc-026278d069c2b6ffa

addRuleSG_22p=$ aws ec2 authorize-security-group-ingress --group-id sg-0032ab410f260ce27 --protocol tcp --port 22 --cidr 87.116.78.97/32

addRuleSG_80p=$ aws ec2 authorize-security-group-ingress --group-id sg-0032ab410f260ce27 --protocol tcp --port 80 --cidr 0.0.0.0/0

runEC2=$ aws ec2 run-instances --image-id ami-0c3083e7f17ee7441 --count 1 --instance-type t2.micro \
--key-name MyKeyPair --subnet-id subnet-05499bb79299f5868 --security-group-ids sg-0032ab410f260ce27 \
--user-data file://my_script.txt

正如您從上面的程式碼中了解的那樣,我們首先創建 SG,這通常是第一步。問題是,當我創建安全組時,我得到了安全組 ID 作為命令的輸出,我需要用行程式碼中的新 ID 替換舊的安全組 ID。

關於這一行程式碼—group-id sg-0032ab410f260ce27

我創建了一個變數,它獲取第一個命令的輸出並將它的而不是 ID,它看起來像這樣:

addRuleSG_80p=$ aws ec2 authorize-security-group-ingress --group-id sg-$var --protocol tcp --port 80 --cidr 0.0.0.0/0

但我收到以下錯誤: 呼叫 AuthorizeSecurityGroupIngress 操作時發生錯誤(InvalidGroupId.Malformed):安全組 ID ‘sg-’ 格式錯誤

任何想法?

awscli 的預設輸出格式是 json。所以在你aws ec2 create-security-group的命令中會產生類似的輸出:

{
   "GroupId": "sg-903004f8"
}

您可以做的是使用類似jq.

MYSG=$(aws ec2 create-security-group --group-name plamenSG \
--description "Security group for SSH access" \
--vpc-id vpc-026278d069c2b6ffa | jq -r '.GroupId')

希望這可以幫助。

一般的技巧是,在創建某些東西之後,您可以:

  • 查詢您嘗試創建的內容現在是否存在

    • 何時執行:從查詢結果中獲取 ID 並將其儲存在變數中以供後續使用。

    • 當它沒有時:

      • 退出並出現錯誤
      • 或者如果創建可以是非同步的:等待並重複循環,直到您想要創建的內容現在存在或在達到最大迭代次數時退出並出現錯誤
  • 另一種方法是利用許多命令會立即告訴您它們創建了什麼並從中提取 ID 的事實。

aws ec2 create-security-group例如應該以 JSON 格式返回帶有 GroupID 的輸出:

{
 "GroupId": "sg-903004f8"
}

在 shell 腳本中,您通常jq用作解析 JSON 輸出的處理器。

要將 GroupID 分配給變數以供後續使用,您可以執行以下操作:

#!/bin/bash 

# Create a new security group

SG_ID_Plamen=$( aws ec2 create-security-group --group-name plamenSG  | jq -r .GroupId ) 

# Optionally create a better test to confirm that the security group has been created
# now only test and exit with an error if SG_ID_Plamen is empty 

if [ -z "$SG_ID_Plamen" ] ; then
  exit 1
fi 

# so something with $SG_ID_Plamen

aws ec2 authorize-security-group-ingress --group-id "$SG_ID_Plamen"

引用自:https://serverfault.com/questions/1107387