AWS CLI の活用例の紹介


My Redmine

いい歳こいて、スプラ3のやりすぎで左の親指が痛いです。見た目は髭、中身は子供、Amazonプロの吉岡(自称)です。

今回は最近よく使う AWS CLI の便利なコマンド集を紹介したいと思います。(備忘録も兼ねて)

AWS CLI とは

まずは簡単にAWS Command Line Interface (AWS CLI)について触れたいと思います。AWSリソースの確認・新規作成・更新・削除などの操作をコマンドライン上で簡単に行えるとてもとても便利なツールです。個人的にはこれがないと生きていけないくらい重要なツールと言えます。

技術的なことなど、詳しくは公式のドキュメントをご確認ください。
https://aws.amazon.com/jp/cli/
https://docs.aws.amazon.com/ja_jp/cli/

活用例の紹介

それではよく使うコマンドをいくつか紹介したいと思います。

  1. S3の中身を確認する方法
  2. 一覧取得
  3. CloudFormation スタックの差分を確認しながら更新する方法

1. S3の中身を確認する方法

例えば以下のようなコマンドを実行すると、ダウンロードせずにファイルの中身を出力できます。zcatを利用しているのでログなどの圧縮ファイルにも対応しています。

# 通常のテキストファイルの出力
aws s3 cp s3://[bucket_name]/path/to/textfile.txt -
# 圧縮ファイルの出力
aws s3 cp s3://[bucket_name]/path/to/access_log.gz - | zcat

ちょっと確認したいだけの場合、手元にファイルが残らないので便利です。パイプで繋いでいるだけですので、表示を加工することも簡単にできます。

2. 一覧取得

例えば、一覧を取得するために aws ec2 describe-instances を実行すると、文字の羅列が出力されて非常に見づらいです。そこで、まずはオプションの --output json と指定して少し見やすくします。

サンプル

aws ec2 describe-instances --output json
=>
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-xxxxxxxxxxx",
                    "InstanceId": "i-xxxxxxxxxxxxx",
                    "InstanceType": "t3.small",
                    "LaunchTime": "2021-08-17T09:09:24+00:00",
                    "Monitoring": {
                        "State": "disabled" 
                    },
                    "Placement": {
                        "AvailabilityZone": "ap-northeast-1c",
                        "GroupName": "",
                        "Tenancy": "default" 
                    },
                    "PrivateDnsName": "ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal",
                    "PrivateIpAddress": "xxx.xxx.xxx.xxx",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "State": {
                        "Code": 80,
                        "Name": "stopped" 
                    },
...

一応これでも情報の確認はできるのですが、情報量が多すぎるのでオプションの --query を使用してさらに情報を絞ります。

aws ec2 describe-instances --output json --query 'Reservations[*].Instances[*].{id:InstanceId, type:InstanceType, status:State.Name, Name:Tags[?Key==`Name`] | [0].Value}'
=>
[
    [
        {
            "id": "i-xxxxxxxxxxx",
            "type": "t3.small",
            "status": "stopped",
            "Name": "aws-cloud9-amplify-handson-xxxxxxxxxxx" 
        }
    ],
    [
        {
            "id": "i-xxxxxxxxxxx",
            "type": "t3a.small",
            "status": "running",
            "Name": "aws-cloud9-xxxxxxxxxxxxxxxxxx" 
        }
    ]
]

これでスッキリと必要な情報の取得ができるようになったと思います。

さらに output のオプションを json から table に変更すると以下のように表形式での出力もできます。

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].{Name:Tags[?Key==Name] | [0].Value, id:InstanceId, type:InstanceType, status:State.Name}'
=>
----------------------------------------------------------------------------------------------------------------
|                                               DescribeInstances                                              |
+--------------------------------------------------------------+----------------------+----------+-------------+
|                             Name                             |         id           | status   |    type     |
+--------------------------------------------------------------+----------------------+----------+-------------+
|  aws-cloud9-amplify-handson-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |  i-xxxxxxxxxxxxxxxxx |  stopped |  t3.small   |
|  aws-cloud9-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                 |  i-xxxxxxxxxxxxxxxxx |  running |  t3a.small  |
+--------------------------------------------------------------+----------------------+----------+-------------+

--outputと--queryを駆使することで自分の見やすいように表示を変えることができます。

便利な query の書き方については公式のドキュメントを参考にしてみてください。

3. CloudFormation スタックの差分を確認しながら更新する方法

最後に応用技になりますが、CloudFormationのスタックを更新時の差分を確認するための方法をご紹介したいと思います。CloudFormationでStackを更新する時にチェンジセットを作成するとリソース単位の差分を取得することはできますが、実際にはリソースは作り直されるだけで設定そのものは変わっていない場合もあり、実際のコードの差分だけ確認したい場合があります。

以下の手順でぞれぞれ差分を確認すると便利です。

  1. CloudFormation のスタックを作成
  2. テンプレートとパラメーターに変更を加え、チェンジセットの作成
  3. 差分の確認と実行

3-1. CloudFormation のスタックを作成

まずは以下のような設定で CloudFormation のスタックを作成します。

スタック名: my-sample-stack

template.yml

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  BucketName:
    Type: String
  RoleName:
    Type: String

Resources: WebBucket: Type: AWS::S3::Bucket Properties: BucketName: !Ref BucketName VersioningConfiguration: Status: Enabled BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256

Role: Type: 'AWS::IAM::Role' Properties: RoleName: !Sub '${RoleName}-${AWS::StackName}' Path: / AssumeRolePolicyDocument: Statement: - Action: 'sts:AssumeRole' Effect: Allow Principal: Service: - ecs-tasks.amazonaws.com ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonS3FullAccess

parameters.json

[
    {
        "ParameterKey": "RoleName",
        "ParameterValue": "farend-v1" 
    },
    {
        "ParameterKey": "BucketName",
        "ParameterValue": "farend-bucket-v1" 
    }
]

実行

aws cloudformation deploy \
  --template-file `pwd`/template.yml \
  --stack-name my-sample-stack \
  --parameter-overrides file://parameters.json \
  --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

3-2. テンプレートとパラメーターに変更を加え、チェンジセットの作成

parameters.json

[
    {
        "ParameterKey": "RoleName",
-       "ParameterValue": "farend-v1" 
+       "ParameterValue": "farend-v2" 
    },
    {
        "ParameterKey": "BucketName",
-       "ParameterValue": "farend-bucket-v1" 
+       "ParameterValue": "farend-bucket-v2" 
    }
]

template.yml

  Role:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: !Sub '${RoleName}-${AWS::StackName}'
      Path: /
      AssumeRolePolicyDocument:
        Statement:
          - Action: 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service:
                - ecs-tasks.amazonaws.com
      ManagedPolicyArns:
-       - arn:aws:iam::aws:policy/AmazonS3FullAccess
+       - arn:aws:iam::aws:policy/AdministratorAccess

チェンジセット作成

aws cloudformation create-change-set \
  --stack-name my-sample-stack \
  --change-set-name [change-set-name] \
  --template-body file://template.yml \
  --parameters file://parameters.json \
  --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
=>
{
    "Id": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:changeSet/[change-set-name]/xxxxxxxx",
    "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/my-sample-stack/xxxxxxxx"
}

3-3. 差分の確認

チェンジセットが作成されたら、既存のスタックとの差分を確認します。以下のコマンドでそれぞれ確認ができます。

# 既存のスタック
# template取得
aws cloudformation get-template --stack-name my-sample-stack --query "TemplateBody" --output text
# parameter取得
aws cloudformation describe-stacks --stack-name my-sample-stack --query 'Stacks[0].Parameters'

# チェンジセット
# template取得
aws cloudformation get-template --change-set-name [change_set_arn] --query "TemplateBody" --output text
# parameter取得
aws cloudformation describe-change-set --change-set-name [change_set_arn] --query 'Parameters'

あとはこれを diff コマンドで比較すれば分かりやすくなります。

テンプレートの差分確認

diff -u \
  <(aws cloudformation get-template --stack-name my-sample-stack --query "TemplateBody" --output text) \
  <(aws cloudformation get-template --change-set-name [changesetarn] --query "TemplateBody" --output text)
=>
--- /dev/fd/63  2022-09-28 xxxxxxxxx +0000
+++ /dev/fd/62  2022-09-28 xxxxxxxxx +0000
      ManagedPolicyArns:
-       - arn:aws:iam::aws:policy/AmazonS3FullAccess
+       - arn:aws:iam::aws:policy/AdministratorAccess

パラメーターの差分確認

diff -u \
  <(aws cloudformation describe-stacks --stack-name my-sample-stack02 --query 'Stacks[0].Parameters') \
  <(aws cloudformation describe-change-set --change-set-name [changesetarn] --query 'Parameters')
=>
--- /dev/fd/63  2022-09-28 xxxxxxxxx +0000
+++ /dev/fd/62  2022-09-28 xxxxxxxxx +0000
 [
     {
         "ParameterKey": "RoleName",
-        "ParameterValue": "farend-v1" 
+        "ParameterValue": "farend-v2" 
     },
     {
         "ParameterKey": "BucketName",
-        "ParameterValue": "farend-bucket-v1" 
+        "ParameterValue": "farend-bucket-v2" 
     }
 ]

ポイント

確認して問題なければ、後はチェンジセットを実行します。

aws cloudformation execute-change-set --change-set-name [change_set_arn]

また、実は CDK を利用すると楽だったりします(cdk diff コマンドで一発)。CDKの紹介についてはまたどこかの機会でお話しできればと考えています。あと、AWS CLI の --query ではなく、jq を利用しても良いと思います。

まとめ

AWSを使っていると便利なサービスが次々出てきて、話題が豊富にあるのですが、今回は基本に立ち返り、AWS CLI 関連で最近よく使うコマンドを中心に紹介させていただきました。今回の執筆にあたってドキュメントを確認したりしたのですが、自分の知らない機能もあったりして、良い学びの機会にもなったかと思います。

以上、この記事が少しでもどなたかのお役に立てれば幸いです!

【スタッフ募集中】
弊社ではAWSを活用したソリューションの企画・設計・構築・運用や、Ruby on Rails・JavaScriptフレームワークなどを使用したアプリケーション開発を行うスタッフを募集しています。詳細はこちら
弊社での勤務に関心をお持ちの方は、知り合いの弊社社員・関係者を通じてご連絡ください。


こちらの記事もオススメです!
AWS Lambda をコンテナイメージで動かした話
Rubyを使ったカスタムコンテナでAWS Lambdaを動かす方法を紹介します。
スマートフォンのアプリのデータをadbコマンドを使用して移行しました
スマホを買い替え。Googleが公開しているコマンドラインツール(adbコマンド)でスマホのデータを移行。
社内セキュリティ教育の教材として調査報告書(つるぎ町立半田病院様公開文書)を採用してみました
半田病院様の調査報告書を教材にしてISMS推進チームの教育を実施しました。
github.com/redmine/redmine の運用を引き継いだ
RedmineのGitHub上のミラーリポジトリの運用をファーエンドテクノロジーが引き継ぎました。
RedMica 2.1(Redmine 5.0互換)と Azure AD で SAML認証 をする方法
RedMica stable-2.1(Redmine 5.0互換)でSAML認証する方法。
ファーエンドテクノロジーからのお知らせ(2024/04/24更新)
入門Redmine 第6版 出版記念企画セミナー「Redmineのアクセス制御」【2024/5/30開催】
入門Redmine 第6版(2024年3月23日発売)の書籍から「Redmineのアクセス制御」について解説します。
My Redmine 初回ご契約で「入門Redmine 第6版」プレゼントのお知らせ
Redmineのクラウドサービス「My Redmine」を初めてご契約いただいたお客様にRedmine解説書「入門Redmine 第6版」を進呈いたします。
2024年度ブランドパートナーに島根県在住のモデル ユイさんを継続起用
ユイさん(モデルスタジオミューズ所属)をファーエンドテクノロジーの2024年度ブランドパートナーとして継続して起用します。
My Redmine スタンダードプランおよびAdminサポートデスクプランの料金改定のお知らせ【2024年4月ご利用分より】
2024年4月ご利用分より、My Redmine スタンダードプラン(民間企業・個人向け及び官公庁向け)とAdminサポートデスクプランの料金を改定いたします。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け