AWS CLI

AWS 命令列工具使用筆記。

Command

aws

檢查 CLI 版本:

aws --version

cdk

設定帳號:

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

configure

取得 Region:

aws configure get region

列出設定:

aws configure list

設定認證:

aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-southeast-1
Default output format [None]: JSON

列出 profiles(設定多個 AWS 帳號):

  • ~/.aws/config
  • ~/.aws/credentials
aws configure list-profiles

event

取得特定 ARN:

aws events list-rules | jq -r '.Rules[] | select(.Name == "minuteRule") | .Arn'

log

顯示 Lambda 日誌:

aws logs tail /aws/lambda/ArplanetAPI_Platform_Linux2_Test --follow --profile default

sts

測試 AWS profile keys 連線:

aws sts get-caller-identity

sam

版本檢查:

# PowerShell
sam --version

# Git Bash
sam.cmd --version

引導式部署:

sam deploy --guided

Service Command

Athena

SQL Query 相關指令請參考 Athena 頁面。

CloudWatch

Agent

檢查 Agent 狀態:

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status

讀取設定檔並重啟 agent:

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/env-config.json -s

Configuration File

主要設定區塊:

  • agent: metrics_collection_interval, region, credentials, debug, logfile, run_as_user
  • metrics: namespace, append_dimensions, aggregation_dimensions, metrics_collected
  • logs: logs_collected, force_flush_interval

範例設定:

{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
  "metrics": {
    "aggregation_dimensions": [["InstanceId"]],
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "cpu": {
        "measurement": ["cpu_usage_idle", "cpu_usage_iowait", "cpu_usage_user", "cpu_usage_system"],
        "metrics_collection_interval": 60,
        "resources": ["*"],
        "totalcpu": false
      },
      "disk": {
        "measurement": ["used_percent", "inodes_free"],
        "metrics_collection_interval": 60,
        "resources": ["*"]
      },
      "mem": {
        "measurement": ["mem_used_percent"],
        "metrics_collection_interval": 60
      }
    }
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/home/ec2-user/log/app/json/**.log",
            "log_group_name": "app-json",
            "log_stream_name": "json-stream",
            "retention_in_days": 1
          }
        ]
      }
    },
    "force_flush_interval": 30
  }
}
如果出現 E! Error parsing /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file or directory,代表少裝了 collectd,使用 sudo apt install collectd 安裝後重新啟動即可。

DynamoDB

列出資料表:

aws dynamodb list-tables --region ap-southeast-1

EC2

列出所有 EC2:

aws ec2 describe-instances
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId]' --output text

列出 keypairs:

aws ec2 describe-key-pairs

IAM

列出使用者:

aws iam list-users

Kinesis Data Stream

放入記錄:

aws kinesis put-record --stream events --partition-key "1" --data 'test1' --cli-binary-format raw-in-base64-out

從 JSON 檔案放入記錄:

aws kinesis put-records --stream-name kds-test --records file://data-example.json --cli-binary-format raw-in-base64-out

Lambda

檢查 Lambda 函數數量:

aws lambda list-functions | jq '.Functions | length'

建立 Lambda:

aws lambda create-function --function-name my-function \
  --runtime python3.9 \
  --role arn:aws:iam::123456789012:role/lambda_execution_role \
  --handler lambda-function.lambda_handler \
  --zip-file fileb:///root/my-function.zip \
  --region us-east-1

呼叫 Lambda:

aws lambda invoke --function-name my-function --payload '{ "name": "your name" }' output.txt

MediaLive

顯示 Channel 狀態:

aws medialive describe-channel --channel-id 9057200 | jq -r '{ State }'

S3

列出所有 S3:

aws s3 ls

上傳檔案到 S3:

aws s3 cp D:/path/to/file.zip s3://bucket-name/folder/ --acl public-read --cache-control max-age="0" --profile default

從 S3 下載檔案:

aws s3 cp s3://bucket/folder /local/folder --recursive

Use Cases

DynamoDB Local Service

Connect

PowerShell:

java -D"java.library.path=./DynamoDBLocal_lib" -jar DynamoDBLocal.jar -port 8888

Linux:

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

Table Operations

列出資料表(預設 port: 8000):

aws dynamodb list-tables --endpoint-url http://localhost:8888

建立資料表:

aws dynamodb create-table \
  --table-name Music \
  --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
  --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
  --table-class STANDARD \
  --endpoint-url http://localhost:8000

使用 JSON 檔案建立:

aws dynamodb create-table --cli-input-json file://create-table-user.json --endpoint-url http://localhost:8000

描述資料表:

aws dynamodb describe-table --table-name Music --endpoint-url http://localhost:8000

新增資料:

aws dynamodb put-item \
  --table-name Music \
  --item '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}}' \
  --return-consumed-capacity TOTAL

掃描資料:

aws dynamodb scan --table-name Music --endpoint-url http://localhost:8000

查詢資料:

aws dynamodb query \
  --table-name Music \
  --key-condition-expression "Artist = :v1 AND SongTitle = :v2" \
  --expression-attribute-values file://expression-attributes.json \
  --endpoint-url http://localhost:8888

刪除資料表:

aws dynamodb delete-table --table-name user --endpoint-url http://localhost:8000

Change Profile User

Windows

CMD:

set AWS_PROFILE=profile_name

PowerShell:

setx AWS_PROFILE profile_name

Git Bash:

export AWS_PROFILE=default

Linux

export AWS_PROFILE=profile_name

Retrieve Instance Type

curl http://169.254.169.254/latest/meta-data/instance-type