【re:Invent 2022 Workshop参加レポート】DOP312: AWS CLI tips and tricks(和訳: AWS CLI のヒントとコツ)

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

11月28日〜12月2日に開催されていたAWS re:Invent 2022に現地で以下のWorkshopに参加したため、レポートを記載いたします。

DOP312: AWS CLI tips and tricks

セッション参加前の話

私はブログの挨拶にも記載している通り、AWS CLIが好きなため、このセッションを見つけたときはテンションがあがりました。

また、セッションにはレベルが設定されており、このセッションは4段階中3段階であるレベル300ということもあり、さらに期待感がありました。

ただ、このセッションは売り切れで予約ができなく、当日参加の列に並ぶことになりましたが、セッション開始1時間前に並んだのにも関わらず、40人以上が並んでおり、参加できないのではと絶望していました...

なんとか、ギリギリで参加できた時には、嬉しさのあまり笑みがこぼれました。

会場の雰囲気

会場の雰囲気は以下の通りで70人(1席7人の10個のテーブル)が参加できるスペースでした。

70人のキャパで40人以上が会場に入れたということで予約できる人数が少なかったのか、予約した人がほとんど欠席したのか気になりますが、とりあえずセッションに参加できたので、よしとします。

概要

Workshopのタイトル通り、AWS CLI利用に関するヒントやコツを学べるWorkshopでした。 また、AWS CLIに関するWorkshopは今回が初だったようです。

それでは、事項からWorkshopで学んだTipsを紹介します。

Tips1 : 楽なAWSプロファイルの切替方法および現在のAWSプロファイルをプロンプトに表示する方法

AWSプロファイルは複数利用かつ何度も切り替えるケースがあるかと存じます。 その場合に「~/.bashrc」に以下の設定しておくと良いという紹介がありました。

この設定は私もやっており、AWSプロファイルを利用する方は設定しておくと良いかなと思います。

やり方

  • 楽なAWSプロファイル切替方法
aws-switch-profile() {
 export AWS_PROFILE=${1}
}

※aws-switch-profileの部分は任意の値となるため、awsspなどさらに短縮することも可能です。

  • 現在のAWSプロファイルをプロンプトに表示する方法
PS1='[\u@\h \W] (${AWS_PROFILE}) $ '

動作確認

以下の通り、aws-switch-profileでプロファイルの切替ができるようになり、プロンプトにプロファイル名が表示することができます。

[root@LAPTOP-CNM26HN6 ~] () $ aws-switch-profile test
[root@LAPTOP-CNM26HN6 ~] (test) $

Tips2: AWS CLIの自動プロンプトモード

AWS CLIのコマンドを入力する際に役立つ機能となります。

やり方

aws --cli-auto-prompt

以下のように入力可能な値が表示されるため、AWS CLIが不慣れな方や初めて使うサブコマンドのオプション確認などに使えるかと存じます。

Tips3 : ウィザードからスクリプトを作成する

ウィザードがスクリプト作成に役立つことを教えてくれました。

AWS CLI ウィザードとは

AWS CLIのコマンドの一部では、サブコマンドとしてウィザードという機能があり、ガイド付きのUIが表示され、AWS CLIの利用を容易にするコマンドが提供されております。 サポートしている数は少ないですが、以下のコマンドが対応しています。

  • aws cli-dev wizard-dev
  • aws dynamodb wizard new-table
  • aws events wizard new-rule
  • aws iam wizard new-role
  • aws lambda wizard new-function

やり方

以下は、「aws iam wizard new-role」のプレビュー画面になります。 この画面で「Ctrl + S」を押下することでファイルとして、CLIの内容を保存してくれます。(よく見ると、AWS CloudFormation templateのコマンドも表示できるため、CFNのテンプレート作成にも役立つかもですね。)

以下は、「Ctrl + S」を押下した後の画面になりますが、ここでファイル名を入力することでファイルを保存します。

ファイルを保存した後、元のプレビューの画面に戻りますが、「Ctrl + C」で処理を中断します。 その後、以下の通り、ファイルが作成されたことを確認できます。

  • 補足1
    上記画像では、ウィザードでロール名を指定する際に「reinvent2022-role」と指定しているため、「--role-name」が固定になっているのですが、スクリプトを利用するにあたっては、変数にしたい箇所になるため、ウィザードで以下のように指定することも可能です。

  • 補足2
    上記、CLIコマンドをよく見るとcreate-role,attach-role-policy以外のコマンドが記載されていることが分かります。実は、「aws iam wizard new-role」は、IAMロールの作成+AWS CLIのConfig設定もしてくれます。

Tips4: AWS CLIのキャッシュされた認証情報の有効活用について

AWS CLIのキャッシュされた認証情報をAWS SDKで利用する方法が紹介されました。

メリット

そもそも、AWS CLIのキャッシュされた認証情報を利用するメリットとしては、MFA認証が必要な場合に、AWS SDKを利用すると都度MFAのコードを入力しなければならないのですが、その煩わしさを解決できることになるかと存じます。

また、AWS CLIの場合でもマルチアカウント構成の場合、複数アカウントのロールにAssume Roleしたいケースがあるかと存じます。 その場合、Assume RoleしたいロールごとにMFAコードを入力する必要がありますが、今回の設定はその煩わしさも解決できます。

私は別の方法でこの煩わしさを回避していたのですが、このやり方の方が簡単そうなので、このやり方に変えようと思っています。

やり方

以下に例を記載しておりますが、[fk-aws]が一般的なアクセスキーとシークレットキーの設定になるかと存じます。 そこに[fk-aws-cache]という新しいプロファイル設定を記載します。 この設定を行うことでAWS SDKで、AWS CLIの認証情報のキャッシュを利用することができるようになります。

  • ファイル名 : ~/.aws/credentials
[fk-aws]
aws_access_key_id=XXXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXX

[fk-aws-cache]
credential_process = aws configure export-credentials --profile fk-aws

以下は別のアカウントのロールにAssume Roleする際の設定を記載しておりますが、 ここの「source_profile」にcredentials ファイルに新しく追加したプロファイルを指定します。

  • ファイル名 : ~/.aws/config
[profile fk-aws-to-prod]
region = ap-northeast-1
output = json
role_arn = arn:aws:iam::222222222222:role/fk-admin-role
source_profile = fk-aws-cache

動作確認

ファイルの中身はAWSのAPIを実行するコードであれば何でも問題ないですが、今回は動作確認用にEC2の一覧を表示するAPIを利用します。

  • ec2_describe.py
import boto3

def ec2_describe() :
    ec2 = boto3.client('ec2')

    responce = ec2.describe_instances()

ec2_describe()

以下にAWS CLIの認証情報のキャッシュの利用有無に応じた動作確認結果を記載いたします。

  • AWS CLIの認証情報のキャッシュを利用しない場合
# python ec2_describe.py
Enter MFA code for arn:aws:iam::111111111111:mfa/fk-iam:
# python ec2_describe.py
Enter MFA code for arn:aws:iam::111111111111:mfa/fk-iam:
# 

2回目のスクリプト実行時にもMFAコードを入力しなければなりません。

  • AWS CLIの認証情報のキャッシュを利用する場合
# python ec2_describe.py
Enter MFA code for arn:aws:iam::111111111111:mfa/fk-iam:
# python ec2_describe.py
#

2回目のスクリプト実行時にMFAコードを入力しなくて良いことが分かります。

Tips5: オプションによるフィルターができない場合は、--queryを使おう

AWS CLIのコマンドには、自分がフィルターしたいオプションが存在しないケースがあるかと存じます。

そんな時に、--queryが使えるという紹介がありました。 例えばスタック名の先頭が「XXXX」のみを表示したいといった場合は以下のコマンドでフィルター可能です。

aws cloudformation list-stacks \
--query "StackSummaries[?starts_with(StackName, 'XXXX')]"

それ以外に後方一致や完全一致、数字の比較なども可能なため、詳細が気になる方は以下のドキュメントを参照ください。

AWS CLI 出力をフィルタリングする - AWS Command Line Interface

Tips6: AWS CLIのエイリアスを使いこなそう

AWS CLIのエイリアスを使いこうなそうということで例としてCloudFormationに関する設定が紹介されました。

  • ~/.aws/cli/alias の設定
[toplevel]
cfn = cloudformation

[command cloudformation]
list = list-stacks --query StackSummaries[].[StackName,StackStatus] --output text
inputs = describe-stacks --query Stacks[].Parameters[].[ParameterKey,ParameterValue] --output text --stack-name
outputs = describe-stacks --query Stacks[].Outputs[].[OutputKey,OutputValue] --output text --stack-name
tempalte = get-template --query "TempalteBody" --output text --stack-name
  • aws cfn list
# aws cfn list
aws-cloud9-fk-test-cloud9-1927418f6fcd49d69106a6ecb2044f84      CREATE_COMPLETE
aws-cloud9-fk-test-cloud9-07fe1d5ad56845b4bbe590a6994389df      CREATE_COMPLETE
#
  • aws cfn inputs prd-fk-serverworks-vpc
# aws cfn inputs prd-fk-serverworks-vpc
OwnerName       Serverworks
VpcCIDR 10.0.0.0/16
EnvironmentName prd
SystemName      fk
#
  • aws cfn outputs prd-fk-serverworks-vpc
# aws cfn outputs prd-fk-serverworks-vpc
VPC     vpc-01f632f058b605780
#
  • aws cfn template prd-fk-serverworks-vpc
# aws cfn template prd-fk-serverworks-vpc
AWSTemplateFormatVersion: 2010-09-09
Description:  This template deploys a VPC

Parameters:
  SystemName:
    Description: Please specify the system name of the resource
    Type: String

  OwnerName:
    Description: Please specify the owner name of the resource
    Type: String

  EnvironmentName:
    Description: Please specify the environment name of the resource
    Type: String
    AllowedValues:
      - prd
      - stg
      - dev
      - poc

  VpcCIDR:
    Description: Please enter the IP range (CIDR notation) for this VPC
    Type: String

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${OwnerName}-${EnvironmentName}-vpc
        - Key: Application
          Value: !Sub ${SystemName}
        - Key: Owner
          Value: !Sub ${OwnerName}
        - Key: Environment
          Value: !Sub ${EnvironmentName}

Outputs:
  VPC:
    Description: A reference to the created VPC
    Value: !Ref VPC
    Export:
      Name:
        Fn::Sub: ${AWS::StackName}-VPC
#

また、「!」を利用することでOSコマンドも利用できるようです。

  • ~/.aws/cli/alias の設定
[toplevel]
show-aliases = !cat ~/.aws/cli/alias
  • aws show-aliases
# aws show-aliases
[toplevel]
cfn = cloudformation
show-aliases = !cat ~/.aws/cli/alias

[command cloudformation]
list = list-stacks --query StackSummaries[].[StackName,StackStatus] --output text
inputs = describe-stacks --query Stacks[].Parameters[].[ParameterKey,ParameterValue] --output text --stack-name
outputs = describe-stacks --query Stacks[].Outputs[].[OutputKey,OutputValue] --output text --stack-name
template = get-template --query "TemplateBody" --output text --stack-name

#

感想

危うく参加できない可能性もありましたが、無事に好きなAWS CLIのWorkshopに参加でき良かったです。

また、私はAWS CLIを使っている方だと思うのですが、Workshopでは私が初めて知った内容もあり、本当に参加できて良かったなと感じました。

あとは、講師の方がデモを行ってくれたのですが、その際のコマンド捌きが早すぎて無表情で見ていましたが、内心は「スゲー」となっておりました。

今回のWorkshopでAWS CLIをさらに好きになりました。AWS CLIをあまり使ったことがない方は、ぜひ使ってみてください!

おわり。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。