いい歳こいて、スプラ3のやりすぎで左の親指が痛いです。見た目は髭、中身は子供、Amazonプロの吉岡(自称)です。
今回は最近よく使う AWS CLI の便利なコマンド集を紹介したいと思います。(備忘録も兼ねて)
まずは簡単にAWS Command Line Interface (AWS CLI)について触れたいと思います。AWSリソースの確認・新規作成・更新・削除などの操作をコマンドライン上で簡単に行えるとてもとても便利なツールです。個人的にはこれがないと生きていけないくらい重要なツールと言えます。
技術的なことなど、詳しくは公式のドキュメントをご確認ください。
https://aws.amazon.com/jp/cli/
https://docs.aws.amazon.com/ja_jp/cli/
それではよく使うコマンドをいくつか紹介したいと思います。
例えば以下のようなコマンドを実行すると、ダウンロードせずにファイルの中身を出力できます。zcatを利用しているのでログなどの圧縮ファイルにも対応しています。
# 通常のテキストファイルの出力 aws s3 cp s3://[bucket_name]/path/to/textfile.txt - # 圧縮ファイルの出力 aws s3 cp s3://[bucket_name]/path/to/access_log.gz - | zcat
ちょっと確認したいだけの場合、手元にファイルが残らないので便利です。パイプで繋いでいるだけですので、表示を加工することも簡単にできます。
例えば、一覧を取得するために 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 の書き方については公式のドキュメントを参考にしてみてください。
最後に応用技になりますが、CloudFormationのスタックを更新時の差分を確認するための方法をご紹介したいと思います。CloudFormationでStackを更新する時にチェンジセットを作成するとリソース単位の差分を取得することはできますが、実際にはリソースは作り直されるだけで設定そのものは変わっていない場合もあり、実際のコードの差分だけ確認したい場合があります。
以下の手順でぞれぞれ差分を確認すると便利です。
まずは以下のような設定で CloudFormation のスタックを作成します。
スタック名: my-sample-stack
template.yml
AWSTemplateFormatVersion: '2010-09-09' Parameters: BucketName: Type: String RoleName: Type: StringResources: 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
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" }
チェンジセットが作成されたら、既存のスタックとの差分を確認します。以下のコマンドでそれぞれ確認ができます。
# 既存のスタック # 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認証する方法。 |
「しまね移住の先輩セミナー ~未経験からはじめるIT移住~」に弊社社員の呂 勝男が登壇 「しまね移住の先輩セミナー ~未経験からはじめるIT移住~」に、ファーエンドテクノロジー社員の呂勝男が登壇いたします。 |
|
オープンソースカンファレンス2025 Osakaに弊社代表の前田が登壇(ブース出展あり) 2025年1月25日に開催されるオープンソースカンファレンス2025 Osakaで、弊社代表の前田によるセミナー発表とブース出展を行います。 |
|
プロジェクト管理ツール「RedMica」バージョン 3.1.0をリリース Redmine互換のオープンソースソフトウェア ファーエンドテクノロジー株式会社は、2024年11月19日(日本時間)、Redmine互換のプロジェクト管理ソフトウェア「RedMica 3.1.0」をリリースしました。 |
|
プロジェクト管理ツールRedmineのクラウドサービス「My Redmine」の海外向けサービス「My Redmine Global Edition」の提供を開始 「My Redmine」の海外向けサービスとして、新たに「My Redmine Global Edition」の提供を開始しました。 |
|
Redmineの最新情報をメールでお知らせする「Redmine News」配信中 新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け |