Memo/AmazonWebServices/awscli

http://dexlab.net/pukiwiki/index.php?Memo/AmazonWebServices/awscli
 

awscli : AWS公式 CUIクライアント

  • AWS コマンドラインインターフェイス | アマゾン ウェブ サービス(AWS 日本語) Amazon製
    • Python 2.6.3 or later
    • CentOS6.x にインストール
      1. yum install python python-setuptools
      2. easy_install pip
      3. pip install awscli
      4.  
      5. aws --profile default configure
      6. AWS Access Key ID [None]: ****
      7. AWS Secret Access Key [None]: ****
      8. Default region name [None]: us-east-1
      9. Default output format [None]: json, table, text から一つ選択
      10.  
      11. # ヘルプ
      12. aws help
    • CentOS5.x
      1. yum install python26 python26-setuptools
      2. easy_install-2.6 pip
      3. pip2.6 install awscli

AWSアカウントIDとARNの確認

  1. aws sts get-caller-identity --profile default
  2.  
  3. {
  4.     "Account": "1234567890",
  5.     "UserId": "AIDXXXXXX",
  6.     "Arn": "arn:aws:iam::1234567890:user/username"
  7. }

~/.aws/config から ~/.aws/credentials を生成する

  • /.aws/config にクレデンシャル等もまとめてある状態から ~/.aws/credentials を生成したい場合

    1. cp ~/.aws/config ~/.aws/credentials
    2. perl -p -i -e "s/profile\s+|^output.+[\r\n]|^region.+[\r\n]|^signature_version.+[\r\n]//g" ~/.aws/credentials

EBSの追加と動的拡張

  • EBSの追加
    1. AWS_PROFILE=default
    2. aws --profile $AWS_PROFILE --region ap-northeast-1 ec2 create-volume --size 10 --volume-type gp2 --availability-zone ap-northeast-1b
    3. # vol-xxxx
    4. aws --profile $AWS_PROFILE --region ap-northeast-1 ec2 attach-volume --device /dev/sdf --volume-id vol-xxxx --instance-id i-xxxx
    • ホスト上の作業
      1. sudo mkdir /mnt/ebs0
      2. sudo mkfs.ext4 /dev/xvdf
      3. sudo mount /dev/xvdf /mnt/ebs0
      4. # /etc/fstab に追加
      5. sudo vim /etc/fstab
      6. --
      7. /dev/xvdf /ext/ebs0 ext4 defaults,nofail 0 0
      8. --

リザーブドインスタンスの価格一覧取得

  • 何もオプションを付けないと大量のリスト取得のため、30秒以上レスポンスが返ってこない。
  • EC2で m3.large インスタンス のリスト取得
    1. aws ec2 describe-reserved-instances-offerings \
    2.   --profile default \ # AWS profile
    3.   --region ap-northeast-1 \ # 東京リージョン
    4.   --instance-tenancy default \ # デフォルトか、ハードウェア専用か
    5.   --offering-type "Partial Upfront" \ # 一部前払い(以前の重度利用)
    6.   --offering-class standard \ 3年の場合はConvertibleも選べる
    7.   --max-duration 31536000 \ # 1年
    8.   --filters "Name=product-description,Values=Linux/UNIX,Linux/UNIX (Amazon VPC)" "Name=scope,Values=Region" \ # Linuxのみ
    9.   --instance-type m3.large \
    10.   --output json
    11.  
    12. {
    13.     "ReservedInstancesOfferings": [
    14.         {
    15.             "OfferingClass": "standard",
    16.             "OfferingType": "Partial Upfront",
    17.             "ProductDescription": "Linux/UNIX",
    18.             "InstanceTenancy": "default",
    19.             "PricingDetails": [],
    20.             "UsagePrice": 0.0,
    21.             "RecurringCharges": [
    22.                 {
    23.                     "Amount": 0.058000000000000003,
    24.                     "Frequency": "Hourly"
    25.                 }
    26.             ],
    27.             "Marketplace": false,
    28.             "CurrencyCode": "USD",
    29.             "FixedPrice": 463.0,
    30.             "Duration": 31536000,
    31.             "Scope": "Region",
    32.             "ReservedInstancesOfferingId": "7875a3da-c41e-40bc-8f81-7e155f5bab77",
    33.             "InstanceType": "m3.large"
    34.         },
    35.         {
    36.             "OfferingClass": "standard",
    37.             "OfferingType": "Partial Upfront",
    38.             "ProductDescription": "Linux/UNIX (Amazon VPC)",
    39.             "InstanceTenancy": "default",
    40.             "PricingDetails": [],
    41.             "UsagePrice": 0.0,
    42.             "RecurringCharges": [
    43.                 {
    44.                     "Amount": 0.058000000000000003,
    45.                     "Frequency": "Hourly"
    46.                 }
    47.             ],
    48.             "Marketplace": false,
    49.             "CurrencyCode": "USD",
    50.             "FixedPrice": 463.0,
    51.             "Duration": 31536000,
    52.             "Scope": "Region",
    53.             "ReservedInstancesOfferingId": "fbc08497-fd12-4bb0-a03b-5e0955899527",
    54.             "InstanceType": "m3.large"
    55.         }
    56.     ]
    57. }

Private DNSからEC2インスタンスを検索する

  1. aws --profile default --region ap-northeast-1 ec2 describe-instances \
  2. --filters 'Name=private-dns-name,Values=ip-01-02-03-04.ap-northeast-1.compute.internal' \
  3. --query "Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[],PublicDnsName:PublicDnsName,State:State.Name}"                                                                                                                                                     
  4.  
  5. [
  6.     {
  7.         "InstanceId": "i-123456",
  8.         "State": "running",
  9.         "PublicDnsName": "ec2-01-02-03-04.ap-northeast-1.compute.amazonaws.com",
  10.         "Tags": [
  11.             {
  12.                 "Value": "web01",
  13.                 "Key": "Name"
  14.             }
  15.         ]
  16.     }
  17. ]

dynamodb

  • テーブル毎のread/writeキャパシティの確認
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. aws --profile $AWS_PROFILE --region $AWS_REGION dynamodb list-tables | jq '.TableNames[]' | xargs -i aws --profile $AWS_PROFILE --region $AWS_REGION dynamodb describe-table --table-name {} --query 'Table.[TableName,ProvisionedThroughput]'
    4.  
    5. [
    6.     "exampleTable",
    7.     {
    8.         "NumberOfDecreasesToday": 0,
    9.         "WriteCapacityUnits": 5,
    10.         "ReadCapacityUnits": 5
    11.     }
    12. ]
    13. ...
  • テーブルのスループットだけ表示
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. DYNAMODB_TABLE_NAME=example01
    4. aws --profile $AWS_PROFILE --region $AWS_REGION dynamodb describe-table --table-name $DYNAMODB_TABLE --query \
    5. 'Table.{TableName:TableName,ProvisionedThroughput:ProvisionedThroughput.{ReadCapacityUnits:ReadCapacityUnits,WriteCapacityUnits:WriteCapacityUnits},GlobalSecondaryIndexes:GlobalSecondaryIndexes[].{IndexName:IndexName,ProvisionedThroughput:ProvisionedThroughput.{ReadCapacityUnits:ReadCapacityUnits,WriteCapacityUnits:WriteCapacityUnits}}}'

classic link: EC2 classicとVPCを接続する

  • aws ec2 attach-classic-link-vpc
    • EC2 classicとVPC内のリソースを接続する
    • EC2 classicには一つのVPC IDだけ設定できる
    • EC2 classicからVPC内のリソースへのアクセスには、private dns/ipを使う。public dns/ipでは接続できなかった
    • Route53のpublic/private自動変換機能は動作しない
  1. AWS_PROFILE=default
  2. AWS_REGION=ap-northeast-1
  3. AWS_VPC_ID=vpc-xxxx
  4. AWS_VPC_SG="sg-xxxx"
  5. AWS_EC2_ID="i-xxxx01 i-xxxx02"
  6.  
  7. aws --profile $AWS_PROFILE --region $AWS_REGION ec2 enable-vpc-classic-link --vpc-id $AWS_VPC_ID
  8.  
  9. for id in $AWS_EC2_ID; do \
  10.   echo "---- $id: ";aws --profile $AWS_PROFILE --region $AWS_REGION ec2 attach-classic-link-vpc --instance-id $id --vpc-id $AWS_VPC_ID --groups $AWS_VPC_SG
  11. done
  • EC2の中から、タグが「Name=web01, web02, ...」、動作中を探して、instance-idを返す
    1. AWS_EC2_ID=$(aws --profile $AWS_PROFILE \
    2.   --region $AWS_REGION \
    3.   ec2 describe-instances \
    4.   --filters "Name=instance-state-name,Values=running" "Name=tag-key,Values=Name" "Name=tag-value,Values=web*" \
    5.   --query 'Reservations[].Instances[].InstanceId' \
    6.   --output text)

CloudFront?

  • aws cli ではpreview版なので有効化
    1. aws configure set preview.cloudfront true
    2. # または
    3. echo -e "[preview]\ncloudfront = true" >> ~/.aws/config

SES

  • EMAILアドレスの検証。サンドボックスでのメール送信前にFROMとTOアドレスをこれで登録する必要がある。
    1. grep -v -P '^\s*$' ses-verify-email.txt | xargs -i aws --profile <AWS PROFILE> --region <AWS REGION> ses verify-email-identity --email-address {}

S3

  • バケット作成:LocationConstraint?を指定しないとUSリージョンに作成される
    1. aws s3api create-bucket --bucket mybucket --create-bucket-configuration LocationConstraint=ap-northeast-1
  • その他
    1. # バケット一覧
    2. aws s3 ls s3://mybucket
    3.  
    4. # s3バケットを再帰的にローカルにコピー
    5. aws s3 cp s3://mybucket/myfolder myfolder --recursive
    6.  
    7. # s3バケットとローカルを同期
    8. aws s3 sync s3://mybucket/myfolder myfolder --exclude *.tmp
    9.  
    10. # デフォルトに指定したリージョン以外の操作には --region オプションを付ける
    11. aws s3 cp s3://mybucket/myfolder myfolder --recursive --region ap-northeast-1
  • バケット内一括削除。確認は無いので注意
    1. aws s3 rm s3://mybucket/ --recursive
  • バケットライフサイクルの指定。JSONが複雑なのでManagement Consoleで設定して、その値を取得すると楽
    1. aws s3api get-bucket-lifecycle --bucket mybucket > bucket-lifecycle.30.json
    2.  
    3. cat bucket-lifecycle.30.json
    4. {
    5.     "Rules": [
    6.         {
    7.             "Status": "Enabled",
    8.             "Prefix": "",
    9.             "Expiration": {
    10.                 "Days": 30
    11.             },
    12.             "ID": "lifecycle-30"
    13.         }
    14.     ]
    15. }
    16.  
    17. aws s3api put-bucket-lifecycle --bucket mybucket --lifecycle-configuration file://bucket-lifecycle.30.json

署名付きオブジェクトURLの生成

  • AWS CLI v1.10.59から presign が実装された。例:1時間で有効期限が切れるURLを発行。IAMでS3Readonly権限を付与したアカウントを用意した後、
    1. aws s3 presign s3://mybucket/example.txt --expires-in 3600
  • AWS CLI(2015-10-15)では未実装だが、botoに実装済みなので、短いスクリプトで生成できるようだ

EC2のホスト一覧の作成

  • EC2インスタンス一覧(Stateでソート、カラム名に"A_, B_"を付けているのは出力カラム順がアルファベットのため)
    1. aws ec2 describe-instances \
    2.   --region ap-northeast-1 \
    3.   --query 'sort_by(Reservations[].Instances[].{A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)' \
    4.   --output text
    • State=runningのみ
      1.   --filters "Name=instance-state-name,Values=running"
    • タグでソートしたい場合(sort_by(, &A_Name) ではnullが含まれると失敗する)
      1.   --output text | sort

CloudWatch?

  • 例:RDSのCloudWatch?メトリクスを設定し、閾値を超えたらメールを送る
  1. AWS SNSトピックを作成
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. RDS_ID=db01
    4. EMAIL=alerts@example.com
    5.  
    6. aws --profile $AWS_PROFILE --region $AWS_REGION \
    7.   sns create-topic --name "AlertToMyemail"
    8. {
    9.     "TopicArn": "arn:aws:sns:ap-northeast-1:1234567890:AlertToMyemail"
    10. }
    11.  
    12. TopicArn="arn:aws:sns:ap-northeast-1:1234567890:AlertToMyemail"
    13.  
    14. aws --profile $AWS_PROFILE --region $AWS_REGION \
    15.   sns subscribe --topic-arn $TopicArn \
    16.   --protocol email \
    17.   --notification-endpoint $EMAIL
  2. 確認メールが届くので "Confirm subscription" をクリック
  3. AWS SNS 設定確認
    1. aws --profile $AWS_PROFILE --region $AWS_REGION \
    2.   sns list-subscriptions-by-topic --topic-arn $TopicArn
  4. RDS:CPUUtilization >= 80% のメトリクスを作成
    1. aws --profile $AWS_PROFILE --region $AWS_REGION \
    2.  cloudwatch put-metric-alarm \
    3.  --alarm-name awsrds-${RDS_ID}-High-CPU-Utilization \
    4.  --alarm-description "Alarm when CPU exceeds 80%" \
    5.  --metric-name CPUUtilization \
    6.  --namespace AWS/RDS \
    7.  --statistic Average \
    8.  --period 300 \
    9.  --threshold 80 \
    10.  --unit Percent \
    11.  --comparison-operator GreaterThanOrEqualToThreshold \
    12.  --dimensions  Name=DBInstanceIdentifier,Value=$RDS_ID  \
    13.  --evaluation-periods 1 \
    14.  --alarm-actions $TopicArn
  5. RDS:FreeStorageSpace? <= 5GB のメトリクスを作成(--threshold 5 --unit Gigabyte の設定は無効。Management Console上では0と表示される)
    1. aws --profile $AWS_PROFILE --region $AWS_REGION \
    2.  cloudwatch put-metric-alarm \
    3.  --alarm-name awsrds-${RDS_ID}-High-Free-Storage-Space \
    4.  --alarm-description "Alarm when Free-Storage-Space less than 5GB" \
    5.  --metric-name FreeStorageSpace \
    6.  --namespace AWS/RDS \
    7.  --statistic Average \
    8.  --period 300 \
    9.  --threshold 5242880000.0 \
    10.  --comparison-operator LessThanOrEqualToThreshold \
    11.  --dimensions  Name=DBInstanceIdentifier,Value=$RDS_ID  \
    12.  --evaluation-periods 1 \
    13.  --alarm-actions $TopicArn
  6. 作成したメトリクスを確認
    1. aws --profile $AWS_PROFILE --region $AWS_REGION \
    2.   cloudwatch describe-alarms --alarm-names awsrds-${RDS_ID}-High-CPU-Utilization awsrds-${RDS_ID}-High-Free-Storage-Space

S3 sync

  • 例: test01とtest02だけをダウンロードしたい
    mybucket
      |-test01
      |-test02
      |-test03
  1. aws s3 sync s3://mybucket/ ./ --exclude "*" --include "test01/*" --include "test02/*"

S3のbucket policy取得

  1. AWS_PROFILE=default
  2. for bucket in $(aws --profile $AWS_PROFILE s3api list-buckets --query "Buckets[].[Name]" --output text); do \
  3. region=$(aws --profile $AWS_PROFILE s3api get-bucket-location --bucket $bucket --output text); \
  4. echo "---- $bucket"; \
  5. aws --profile $AWS_PROFILE --region $region s3api get-bucket-policy --bucket $bucket; \
  6. done > $AWS_PROFILE.s3.bucket-policy.json

EMR

  • 稼働中のEMRクラスタの一覧
    1. aws --region ap-northeast-1 list-clusters --active
  • EMRクラスタの強制終了
    1. aws --region ap-northeast-1 emr terminate-clusters --cluster-ids j-xxxxxxxx

RDS

  • MySQL 5.6 設定:日本語(絵文字utf8mb4含む)ケースの例
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. DB_PARAMETER_GROUP_NAME=test
    4. DB_PARAMETER_GROUP_DESCRIPTION="For $DB_PARAMETER_GROUP_NAME"
    5. aws --profile $AWS_PROFILE --region $AWS_REGION rds create-db-parameter-group \
    6.   --db-parameter-group-name $DB_PARAMETER_GROUP_NAME \
    7.   --db-parameter-group-family mysql5.6 \
    8.   --description "$DB_PARAMETER_GROUP_DESCRIPTION"
    9. aws --profile $AWS_PROFILE --region $AWS_REGION rds modify-db-parameter-group \
    10.   --db-parameter-group-name $DB_PARAMETER_GROUP_NAME \
    11.   --parameters \
    12.   "ParameterName=max_connections,ParameterValue=1000,ApplyMethod=immediate" \
    13.   "ParameterName=max_connect_errors,ParameterValue=999999999,ApplyMethod=immediate" \
    14.   "ParameterName=character_set_client,ParameterValue=utf8mb4,ApplyMethod=immediate" \
    15.   "ParameterName=character_set_server,ParameterValue=utf8mb4,ApplyMethod=immediate" \
    16.   "ParameterName=collation_server,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate" \
    17.   "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" \
    18.   "ParameterName=long_query_time,ParameterValue=3,ApplyMethod=immediate" \
    19.   "ParameterName=max_heap_table_size,ParameterValue=$(expr 32 \* 1024 \* 1024),ApplyMethod=immediate" \
    20.   "ParameterName=tmp_table_size,ParameterValue=$(expr 32 \* 1024 \* 1024),ApplyMethod=immediate" \
    21.   "ParameterName=thread_cache_size,ParameterValue=32,ApplyMethod=immediate" \
    22.   "ParameterName=innodb_file_per_table,ParameterValue=1,ApplyMethod=immediate" \
    23.   "ParameterName=innodb_file_format,ParameterValue=Barracuda,ApplyMethod=immediate" \
    24.   "ParameterName=innodb_large_prefix,ParameterValue=1,ApplyMethod=immediate"
  • DBパラメータグループの初期化
    1. aws --profile $AWS_PROFILE --region $AWS_REGION rds reset-db-parameter-group \
    2.   --db-parameter-group-name $DB_PARAMETER_GROUP_NAME \
    3.   --no-reset-all-parameters \
    4.   --parameters "ParameterName=max_connections,ApplyMethod=immediate"
  • RDSのバージョンを取得
    1. aws --profile default --region ap-northeast-1 rds describe-db-instances --query "DBInstances[].[DBInstanceIdentifier,EngineVersion,StorageType]" --output table
    2.  
    3. -----------------------------------------------------
    4. |           DescribeDBInstances                     |
    5. +-----------------------------+----------+----------+
    6. |  example-db-01              |  5.5.40  | standard |
    7. |  example-db-02              |  5.6.13  | gp2      |
    8. +-----------------------------+----------+----------+
  • RDSのMaintenance windowを、リージョン毎に一括設定する。時間はUTC。火曜日の午前6:00-6:30に設定する場合
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. AWS_MAINTENANCE_WINDOW=Mon:21:00-Mon:21:30
    4. for id in $(aws --profile $AWS_PROFILE --region $AWS_REGION rds describe-db-instances --query "DBInstances[].[DBInstanceIdentifier]" --output text); do \
    5. aws --profile $AWS_PROFILE --region $AWS_REGION rds modify-db-instance --preferred-maintenance-window $AWS_MAINTENANCE_WINDOW --db-instance-identifier $id; \
    6. done
  • マニュアルで取ったスナップショット一覧
    1. aws --region ap-northeast-1 rds describe-db-snapshots --snapshot-type manual

RDSイベントログの取得

管理コンソールからは過去2日分しか見えないが、awscliならそれ以上に取得できる。

  1. aws --profile default rds describe-events --source-identifier <rds id> --source-type db-instance --start-time 2016-11-22T00:00:00
  2.  
  3. # 日付とイベントだけ抽出する場合、以下を追加
  4. --query 'Events[].[Date,Message]'

DBParameterGroupName?の取得

  • 全リージョンのDBParameterGroupName?を取得(mysqlを指定)
    1. AWS_PROFILE=default
    2. for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    3.   for i in $(aws --profile $AWS_PROFILE --region $region rds describe-db-parameter-groups --query 'DBParameterGroups[?contains(DBParameterGroupFamily, `mysql`)].[DBParameterGroupName]' --output text); do \
    4.     echo "$region, $i"; \
    5.   done \
    6. done

スケジュールイベントの取得

  • 全リージョンのEC2, RDS, ElastiCache?イベントをjsonとして出力
    1. AWS_PROFILE=default
    2. for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    3. aws --profile $AWS_PROFILE --region $region ec2 describe-instance-status --filters "Name=event.code,Values=*" --query "InstanceStatuses[].{InstanceId:InstanceId, Events:Events}" --output json > $AWS_PROFILE.$region.ec2.events.json ; \
    4. aws --profile $AWS_PROFILE --region $region rds describe-events > $AWS_PROFILE.$region.rds.events.json ; \
    5. aws --profile $AWS_PROFILE --region $region elasticache describe-events > $AWS_PROFILE.$region.elasticache.events.json ; \
    6. done
  • EC2のCompleted以外のイベントを表示。除外したい文字列の場合「==false」または「|not」が使える。
    1. cat *.ec2.events.json | jq '.[]|select(.Events[].Description|contains("Completed")==false)'
  • RDSのイベントを表示
    1. cat *.rds.events.json
  • ElastiCache?のイベントを表示
    1. cat *.elasticache.events.json

インスタンスIDから、インスタンス名の検索

  1. aws ec2 describe-instances \
  2.   --region ap-northeast-1 \
  3.   --instance-ids i-12345678 i-90123456 \
  4.   --query "Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[],PublicDnsName:PublicDnsName,State:State.Name}"
  5.  
  6. [
  7.     {
  8.         "InstanceId": "i-12345678",
  9.         "State": "running",
  10.         "PublicDnsName": "ec2-12-34-56-78.ap-northeast-1.compute.amazonaws.com",
  11.         "Tags": [
  12.             {
  13.                 "Value": "host01",
  14.                 "Key": "Name"
  15.             },
  16.         ]
  17.     },
  18.     {
  19.      ...
  20.     }
  21. ]

タグ付け

リソース指定方法や、タグの書式が違う。

  • aws-cli/1.3.2
  • EC2
    1. aws --profile test-user ec2 create-tags \
    2.  --region us-east-1 \
    3.  --resources i-xxxxxx01 i-xxxxxx02 \
    4.  --tags Key=MY-KEY,Value=MY-VALUE
  • RDS
    1. aws --profile test-user rds add-tags-to-resource \
    2.  --region us-east-1 \
    3.  --resource-name arn:aws:rds:us-east-1:1234567890:db:MY-RDS-01 \
    4.  --tags Key=MY-KEY,Value=MY-VALUE
  • S3
    1. aws --profile test-user s3api put-bucket-tagging \
    2.  --region us-east-1 \
    3.  --bucket mybucket \
    4.  --tagging '
    5. {
    6.   "TagSet": [
    7.     {
    8.       "Key": "MY-KEY",
    9.       "Value": "MY-VALUE"
    10.     }
    11.   ]
    12. }'

SSL証明書を管理

  • IAMにアップロードされているSSL証明書の一覧
    1. aws --profile test-user --region us-east-1 s3api restore-object --bucket mybucket --key logs/host1/access.log-20140101.gz --restore-request '{"Days": 1}'
  • ELBのリスナーで使用されているSSL証明書の一覧
    1. aws --profile test-user --region us-east-1 s3 cp s3://mybucket/logs/host1/access.log-20140101.gz ./host1/
  • IAMにSSL証明書をアップロード。名前は「ドメイン.期限」としておけば分かりやすい。ホームディレクトリにファイルがある場合は file://~/file.key 。ARNをメモしておく
    1. AWS_PROFILE=default
    2. AWS_REGION=us-east-1
    3. S3_BUCKET=mybucket
    4. S3_PREFIX=path/to/access.log-201705
    5. S3_FILTER='201705(0[2-9]|1[0-1])'
    6. RESTORE_DAYS=3
    7.  
    8. for key in $(aws s3api list-objects --profile $AWS_PROFILE --region $AWS_REGION --bucket $S3_BUCKET --prefix $S3_PREFIX --output json | jq -r '.Contents[].Key' | grep -P $S3_FILTER); \
    9.   do echo $key; aws s3api restore-object --profile $AWS_PROFILE --region $AWS_REGION --bucket $S3_BUCKET --key $key --restore-request "{\"Days\": $RESTORE_DAYS}"; \
    10. done
  • ELBにHTTPSリスナーを追加する場合
    1. aws s3 cp s3://$S3_BUCKET/$(dirname $S3_PREFIX)/ ./ \
    2.  --profile $AWS_PROFILE --region $AWS_REGION \
    3.  --recursive --exclude "*" --include "access.log-201705*" --dryrun
  • ELBのSSL証明書を更新する場合
    1. aws iam list-server-certificates
    2.  
    3. {
    4.     "ServerCertificateMetadataList": [
    5.         {
    6.             "Path": "/",
    7.             "Arn": "arn:aws:iam::000000000000:server-certificate/example.com",
    8.             "ServerCertificateId": "XXXXXXXXXXXXXXXXXXXXX",
    9.             "ServerCertificateName": "example.com",
    10.             "UploadDate": "2014-01-02T03:40:50Z"
    11.         }
    12.     ]
    13. }
  • IAMからSSL証明書を削除する場合。ELBで使用中でも削除できるので注意
    1. aws elb describe-load-balancers \
    2.  --query "LoadBalancerDescriptions[].[LoadBalancerName,ListenerDescriptions[].Listener[].SSLCertificateId]" \
    3.  --region us-east-1
    4.  
    5. [
    6.     [
    7.         "example.com",
    8.         [
    9.             "arn:aws:iam::000000000000:server-certificate/example.com"
    10.         ]
    11.     ]
    12. ]

ec2 cliとaws cliの速度比較

  • ec2 cliはjavaベースなので毎回JVMを起動する分遅いと思われる
  • aws cliはpythonベース
  • サンプルスクリプト
    • File not found: "ec2cli_vs_awscli.sh" at page "Memo/AmazonWebServices/awscli"[添付]
  • ec2 cliとaws cliを5回ずつ呼んだ結果。毎回5秒のwait。7回以上は Web Service Call Limits にひっかかり、ある程度waitをいれないと値が取れない
    1. aws iam upload-server-certificate \
    2.   --server-certificate-name example.com.20170101 \
    3.   --certificate-body file://example.com.20170101.crt \
    4.   --private-key file://example.com.20170101.key.nopass \
    5.   --certificate-chain file://certificate_chain_file.crt

EC2 Security Group

  • 全リージョンのセキュリティグループの取得
    1. ARN="arn:aws:iam::012345678901:server-certificate/production/newCert"
    2. aws --region ap-northeast-1 \
    3.  elb create-load-balancer-listeners \
    4.  --load-balancer-name elb01 \
    5.  --listeners Protocol=HTTPS,LoadBalancerPort=443,InstanceProtocol=HTTP,InstancePort=80,SSLCertificateId=$ARN
    • 特定のIPアドレスを含む結果をフィルタリング(jqがキーの大文字、小文字を区別するので、一つのフィルタに出来なかった点がイマイチ)
      1. ARN="arn:aws:iam::012345678901:server-certificate/production/newCert"
      2. aws --region ap-northeast-1 \
      3.  elb set-load-balancer-listener-ssl-certificate \
      4.  --load-balancer-name elb01 \
      5.  --load-balancer-port 443 \
      6.  --ssl-certificate-id $ARN
  • MySecurityGroup?GatewaySecurityGroup? からsshで接続できるように設定
    1. aws iam delete-server-certificate \
    2.   --server-certificate-name example.com
  • ELBからのTCPを許可
    1. # CentOS 6.3
    2.  
    3. # ec2 cli (java 1.6.0_24)
    4. bash ec2cli_vs_awscli.sh i-xxxxxxxx ec2 5
    5. ...
    6. Elapsed time: 30.725 sec.
    7.  
    8. # aws cli (python 2.6.6)
    9. bash ec2cli_vs_awscli.sh i-xxxxxxxx aws 5
    10. ...
    11. Elapsed time: 26.984 sec.
  • ELBから全てのプロトコル(tcp, udp, icmp)を許可
    1. AWS_PROFILE=test-user
    2. for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    3. echo "---- $region"; aws --profile $AWS_PROFILE --region $region ec2 describe-security-groups --query 'SecurityGroups[].{GroupName:GroupName, IpRanges:IpPermissions[].IpRanges[]}' > $AWS_PROFILE.$region.ec2.security-groups.json; \
    4. aws --profile $AWS_PROFILE --region $region  rds describe-db-security-groups --query 'DBSecurityGroups[].{GroupName:DBSecurityGroupName, IpRanges:IPRanges[]}' > $AWS_PROFILE.$region.rds.security-groups.json; \
    5. done

条件を指定してテキスト形式でのリストを取得

  • TCPのIPリストを取得
    1. SECURITY_GROUPS_FILTER='"0.0.0.0/32","1.2.3.4/32"'
    2.  
    3. for file in $(ls $AWS_PROFILE.*.ec2.security-groups.json); do \
    4. echo "---- $file"; cat $file | jq -r ".[]|select(.IpRanges[].CidrIp|contains($SECURITY_GROUPS_FILTER))"; \
    5. done > filtered.$AWS_PROFILE.ec2.security-groups.json
    6.  
    7. for file in $(ls $AWS_PROFILE.*.rds.security-groups.json); do \
    8. echo "---- $file"; cat $file | jq -r ".[]|select(.IpRanges[].CIDRIP|contains($SECURITY_GROUPS_FILTER))"; \
    9. done > filtered.$AWS_PROFILE.rds.security-groups.json

--query : 出力項目指定

  • filtersで検索対象を指定し、--queryで出力項目を指定する
  • [*] は [] に省略できる
  • 配列を平分に変換
  • 配列内の値を出力。「|[0]」を使う。
    1. aws --profile test-user ec2 authorize-security-group-ingress \
    2.   --group-name MySecurityGroup \
    3.   --protocol tcp \
    4.   --port 22 \
    5.   --source-group GatewaySecurityGroup
  • EC2からTag Name : my-host-01 のインスタンスIDを取得する
    1. aws --profile test-user ec2 authorize-security-group-ingress \
    2.   --group-name MySecurityGroup \
    3.   --protocol tcp \
    4.   --port 0-65535 \
    5.   --group-owner amazon-elb \
    6.   --source-group amazon-elb-sg
  • {...}でjson出力時のkeyの別名(alias)を指定できる。別名を使うときは出力する全てのキーに別名を付ける
    • 例:VolumeId?にIDという別名を付ける
      1. aws --profile test-user ec2 authorize-security-group-ingress \
      2.   --group-name MySecurityGroup \
      3.   --source-security-group-owner-id amazon-elb \
      4.   --source-security-group-name amazon-elb-sg
  • 複数の項目を指定して列挙する
    • 親階層の列挙時に、子階層のアイテムは参照できる。
    • 子階層の列挙時に、親階層のアイテムは参照できない。
    • 例:ELBを列挙して、DNSNameとInstanceId?を表示
      1. aws ec2 describe-security-groups --group-id sg-123456 \
      2.   --query 'SecurityGroups[].IpPermissions[?contains(IpProtocol, `tcp`)].IpRanges' \
      3.   --output text
      • 子階層の列挙時に、親階層のアイテム参照は値が取れずnullになる
        1. # 通常
        2. aws rds describe-reserved-db-instances-offerings \
        3.   --region ap-northeast-1 \
        4.   --duration 1 \
        5.   --max-items 1 \
        6.   --query 'ReservedDBInstancesOfferings[].[DBInstanceClass,RecurringCharges]'
        7.  
        8. [
        9.     [
        10.         "db.t1.micro",
        11.         [
        12.             {
        13.                 "RecurringChargeAmount": 0.023,
        14.                 "RecurringChargeFrequency": "Hourly"
        15.             }
        16.         ]
        17.     ]
        18. ]
        19.  
        20. # "|[0]" 指定
        21. aws rds describe-reserved-db-instances-offerings \
        22.   --region ap-northeast-1 \
        23.   --duration 1 \
        24.   --max-items 1 \
        25.   --query 'ReservedDBInstancesOfferings[].[DBInstanceClass,RecurringCharges[].RecurringChargeAmount|[0]]'
        26.  
        27. [
        28.     [
        29.         "db.t1.micro",
        30.         0.023
        31.     ]
        32. ]
  • ELBでSSLCertificateId?を列挙。(SSL証明書更新時に、どのELBがSSL Listener持っているのかを調べる時など)
    1. aws ec2 describe-instances --filters "Name=tag-key,Values=Name" \
    2.   "Name=tag-value,Values=my-host-01" \
    3.   --query "Reservations[*].Instances[*].InstanceId" \
    4.   --output table
    5.  
    6. -------------------
    7. |DescribeInstances|
    8. +-----------------+
    9. |  i-xxxxxxxx     |
    10. +-----------------+

Route53を使う

  • ドメイン名から、該当するレコード一覧(A, CNAMEのみ)を取得
    1. aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,AZ:AvailabilityZone,Size:Size}'
    2.  
    3. [
    4.     {
    5.         "AZ": "ap-northeast-1a",
    6.         "ID": "vol-xxxxxxxx",
    7.         "Size": 8
    8.     },
    9.     {
    10.         "AZ": "ap-northeast-1b",
    11.         "ID": "vol-xxxxxxxx",
    12.         "Size": 8
    13.     }
    14. ]
    • 「--dns-name」オプションは一致しなくとも、何かしらの値を返すので使えなかった

複数のプロファイルを使い分ける

  • profile名を指定して生成
    1. aws elb describe-load-balancers \
    2.   --query "LoadBalancerDescriptions[].[DNSName,Instances[].InstanceId]"
    3.  
    4. [
    5.     [
    6.         "example1-0000000000.ap-northeast-1.elb.amazonaws.com",
    7.         [
    8.             "i-xxxxxxxx",
    9.             "i-xxxxxxxx"
    10.         ]
    11.     ],
    12.     [
    13.         "example2-0000000000.ap-northeast-1.elb.amazonaws.com",
    14.         [
    15.             "i-xxxxxxxx"
    16.         ]
    17.     ]
    18. ]
  • /.aws/config

    1. aws elb describe-load-balancers \
    2.   --query "LoadBalancerDescriptions[].Instances[].[LoadBalancerDescriptions[].DNSName,InstanceId]"
    3.  
    4. [
    5.     [
    6.         null,
    7.         "i-xxxxxxxx"
    8.     ],
    9.     [
    10.         null,
    11.         "i-xxxxxxxx"
    12.     ]
    13. ]
  • 実行
    1. aws elb describe-load-balancers \
    2.  --query "LoadBalancerDescriptions[].[LoadBalancerName,ListenerDescriptions[].Listener[].SSLCertificateId]"
    3.  
    4. [
    5.     [
    6.         "example1",
    7.         [
    8.             "arn:aws:iam::000000000000:server-certificate/example.com"
    9.         ]
    10.     ] 
    11. ]
  • 環境変数を指定する方法
    1. AWS_PROFILE=default
    2. DNS_NAME=example.com
    3. HOSTED_ZONE_ID=$(aws --profile $AWS_PROFILE route53 list-hosted-zones-by-name --max-items 1 --query "HostedZones[?Name == '${DNS_NAME}.'].[Id]" --output text)
    4. aws --profile $AWS_PROFILE route53 list-resource-record-sets --hosted-zone-id $HOSTED_ZONE_ID  --query "ResourceRecordSets[?Type == 'CNAME' || Type == 'A'].[Name]" --output text

legacy

javaだったりruby製だったりした。

keypairのフィンガープリント確認

AWS ManagementConsole?のkeypairとローカルファイル(pem)を比較する場合

  1. aws --profile test-user configure

タグ付け

  • インスタンス、AMI、EBS等にタグを設定できる。「i-xxxxxxxx vol-xxxxxxxx」等複数同時に設定できる
  • インスタンスにNameタグを付けるとManagementConsole?で名前に表示できる
    1. [default]
    2. aws_access_key_id=AKIAIOSFODNN7EXAMPLE
    3. aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    4. region=us-east-1
    5.  
    6. [profile test-user]
    7. aws_access_key_id=AKIAI44QH8DHBEXAMPLE
    8. aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
    9. region=us-west-2
  • EBSでもNameタグを付けるとManagementConsole?で名前に表示できる
    1. aws --profile test-user s3 ls s3://mybucket

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-30 (火) 13:41:18 (418d)