AWS CLI 入門 ~ CloudFormation への導き~|研修コースに参加してみた
今回参加したコースは AWS CLI 入門 ~ CloudFormation への導き~ です。
AWS というとコマンド操作しなくても画面をポチポチしているとサーバが立てられるというのが画期的なポイントの一つでしたが、 AWS CLI を使えばコマンドでも S3 や EC2 などを利用できます。 …… こう言うと「それ、コマンド使う必要ある?」という疑問を持ってしまいます。
ところで、話は全く変わりますが、シェルスクリプトは Linux マシンを操作する上で欠かせないものですが、シェルスクリプトやライブラリを組み合わせてサーバ構築やログ収集、監視などの自動化もできます。
このコースを受講してみると、 AWS CLI は AWS 用に拡張されたシェルスクリプトであり、その先には AWS CloudFormation というクラウドらしいプロビジョニング、オーケストレーションなど Infrastructure as Code ( Iac ) の入り口になる技術だとわかりました。 さすが、大澤さん、タイトルがオシャレです。
では、どのような内容だったのか、レポートします!
コース情報
想定している受講者 |
|
---|---|
受講目標 | コマンドラインで AWS を操作できるようになる |
講師紹介
このコースで登壇されたのは前回 Kubernetes のコースでも登壇された 大澤 文孝 さんです。
テクニカルライター/プログラマー、情報処理資格としてセキュリティスペシャリスト、ネットワークスペシャリストを取得。
Web システムの設計・開発とともに、長年の執筆活動のなかで、電子工作、 Web システム、プログラミング、データベースシステム、パブリッククラウドに関する書籍を多数執筆している。
-
主な著書
- 「 AWS ネットワーク入門 第 2 版」(インプレス 刊)
- 「 AWS Lambda 実践ガイド 第 2 版」(日経 BP 社 刊)
- 「 Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂 3 版」(共著 日経 BP 社 刊)
- 「ハンズオンで分かりやすく学べる Google Cloud 実践活用術 AI・機械学習編 Google 監修」(日経 BP 社 刊)
- 「ゼロからわかる Amazon Web Services 超入門 はじめてのクラウド」(技術評論社 刊) など
AWS CLI とは
まずは AWS CLI とは何か、説明いただきました。
- AWS を操作するコマンドラインツール
- ブラウザの マネジメントコンソール 以上のことができる
- AWS CLI コマンドでは
aws
を使う$ aws s3 ls # S3 に ls コマンドを実行
- 使用する環境は 3 つから選ぶ
- Windows / MacOS / Linux にインストール
- Amazon Linux 2 を使う
- AWS CloudShell を使う
- 認証等はデフォルトで設定済み
- このコースではこれを使用
なお、 AWS CLI を自分でインストールする場合は、 IAM でアクセスキーを発行して、それを AWS CLI に設定する必要があります。
AWS CLI の使い方とコマンドの基本
CloudShell を使うには AWS のマネジメントコンソールでリージョンを選択し、「 CloudShell 」ボタンをクリックします。
何も準備しないで動きました。 簡単ですね。
では、コマンドを試してみましょう。
- 基本コマンド
$ aws command ( s3, ec2 などの対象) sub_command ( 対象への操作 cp, ls など) option
- ex. VPC の一覧の情報を出す
$ aws ec2 describe-vpcs { "Vpcs": [ { "CidrBlock": "172.11.0.0/16", "DhcpOptionsId": "dopt-************************", "State": "available", "VpcId": "vpc-*****************************", "OwnerId": "**********", "InstanceTenancy": "default", "CidrBlockAssociationSet": [ { "AssociationId": "vpc-cidr-assoc-********", "CidrBlock": "172.11.0.0/16", "CidrBlockState": { "State": "associated" } } ], "IsDefault": true } ] }
S3 を使ってみよう
では、 AWS CLI を実際に使ってみましょう!
- バケット名を決める
- バケット名は全世界でユニークである必要がある
- bash の環境変数で予め決めておくと便利
$ export set MYBUCKET=random-20221001-自分の名前
- バケットをつくる
$ aws s3 mb s3://$MYBUCKET # mb は make bucket の略 make_bucket: random-20221021-mybucket
- S3 バケットができていることをマネジメントコンソールで確認
- S3 バケットができていることをマネジメントコンソールで確認
- 大澤さんが予め用意した index.html などをダウンロードして S3 にコピー
- ダウンロードして展開
$ curl -O https://mofukabur.com/seplusex/example.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 28638 100 28638 0 0 18175 0 0:00:01 0:00:01 --:--:-- 18182 $ unzip example.zip Archive: example.zip creating: example/ inflating: example/index.html inflating: example/mofu.jpg
- sync コマンド( Linux で言う rsync )で S3 のディレクトリと同期する
$ aws s3 sync ./example s3://$MYBUCKET
- 静的ホスティングを enable
$ aws s3 website s3://$MYBUCKET/ --index-document index.html --error-document error.html
- 誰でも閲覧できるようにバケットポリシーを設定
- 大澤さんが予め用意された内容をもとに allread.json を vi で作成
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::random-20221021-mybucket/*" } ] }
- ポリシーをアプライ
$ aws s3api put-bucket-policy --bucket $MYBUCKET --policy file://allread.json # s3api は S3 API を操作するコマンド。 s3 コマンドよりレイヤが低い
- 大澤さんが予め用意された内容をもとに allread.json を vi で作成
S3 バケットを作って HTML と画像を表示する
ブラウザで S3 http://random-20221021-mybucket.s3-website-us-east-1.amazonaws.com/
にアクセスしてみましょう!
このあと作成した S3 を消しました。
この演習後、大澤さんから「やってみてどうでしょうか? マネジメントコンソールと AWS CLI どっちがよかったですか?」と問いかけられました。 個人的に、この時点ではマネジメントコンソールのほうが、レスポンスがわかりやすくていいなぁ、という印象でした。
なお、 s3 コマンドは膨大にあるので、リファレンスを見るとよいでしょう、と大澤さんから紹介いただきました。
VPC / EC2 を作ってみよう
続いて EC2 の定番の構成ですが、 VPC (Virtual Private Cloud) を作って、その中に EC2 インスタンスを作成し、 Web サーバを立ててみましょう。
また ec2 コマンドも沢山あるので、これもリファレンスを紹介いただきました。
- VPC を作成 → 発行された VpcId を環境変数に保存
$ aws ec2 create-vpc --cidr-block 15.0.0.0/16 \ > --tag-specifications ResourceType=vpc,Tags='[{Key=Name,Value="examplevpc"}]' { "Vpc": { "CidrBlock": "15.0.0.0/16", "DhcpOptionsId": "dopt-************************", "State": "pending", "VpcId": "vpc-*****************************", # 略 } } $ export set VPCID=vpc-*****************************
- サブネットを作成 → SubnetId を環境変数に保存
$ aws ec2 create-subnet --vpc-id $VPCID --cidr-block 15.0.0.0/24 --availability-zone us-east-1a { "Subnet": { "AvailabilityZone": "us-east-1a", "AvailabilityZoneId": "use1-az1", "AvailableIpAddressCount": 251, "CidrBlock": "15.0.0.0/24", "DefaultForAz": false, "MapPublicIpOnLaunch": false, "State": "available", "SubnetId": "subnet-*************", # 略 } } $ export set SUBNETID=subnet-*************
- パブリック IP の割り当てを enable
$ aws ec2 modify-subnet-attribute --subnet-id $SUBNETID --map-public-ip-on-launch
- インターネットゲートウェイを作成 → InternetGatewayId を環境変数に保存
$ aws ec2 create-internet-gateway { "InternetGateway": { "Attachments": [], "InternetGatewayId": "igw-***************", # 略 } } $ export set IGWID=igw-***************
- VPC とインターネットゲートウェイを紐づけ
$ aws ec2 attach-internet-gateway \ > --internet-gateway-id $IGWID --vpc-id $VPCID
- ルートテーブルの一覧を確認 → RouteTableAssociationId を環境変数に保存
$ aws ec2 describe-route-tables \ > --filters Name=vpc-id,Values=$VPCID # --filters で Key Value の検索が可能 { "RouteTables": [ { "Associations": [ { "Main": true, "RouteTableAssociationId": "rtbassoc-*************", "RouteTableId": "rtb-************", "AssociationState": { "State": "associated" } } ], # 略 } ] } $ export ROUTERID=rtbassoc-*************
- ルートテーブルを設定
$ aws ec2 create-route --route-table-id $ROUTERID --destination-cidr-block 0.0.0.0/0 --gateway-id $IGWID { "Return": true }
これで VPC の設定が完了しました。 改めて AWS のネットワークは独自のものがあり、復習の余地ありです。
では、 EC2 インスタンスを作成 … の前に準備することが沢山あります。 セキュリティグループの作成やポートの開放、 SSH に必要なキーの発行などです。
- 事前準備 セキュリティグループを作成して GroupId を保存
$ aws ec2 create-security-group --group-name exsample-sg \ > --vpc-id $VPCID --description "port 22, 80, 443 enable" { "GroupId": "sg-***************" } $ export SGID=sg-***************
- 事前準備 ポート 22, 80, 443 を開ける
$ aws ec2 authorize-security-group-ingress --group-id $SGID \ > --protocol tcp --port 22 --cidr 0.0.0.0/0 { "Return": true, "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-************", "GroupId": "sg-***************", "GroupOwnerId": "625708477374", "IsEgress": false, "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIpv4": "0.0.0.0/0" } ] } # ssh ポートを作ると自動的に ssh ログインするので出ましょう $ aws ec2 authorize-security-group-ingress --group-id $SGID \ > --protocol tcp --port 80 --cidr 0.0.0.0/0 { "Return": true, "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-************", "GroupId": "sg-***************", "GroupOwnerId": "625708477374", "IsEgress": false, "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIpv4": "0.0.0.0/0" } ] } $ aws ec2 authorize-security-group-ingress --group-id $SGID \ > --protocol tcp --port 443 --cidr 0.0.0.0/0 { "Return": true, "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-************", "GroupId": "sg-***************", "GroupOwnerId": "625708477374", "IsEgress": false, "IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "CidrIpv4": "0.0.0.0/0" } ] }
- 事前準備 キーペアを作成して権限を変更
$ aws ec2 create-key-pair --key-name example-key \ --query 'KeyMaterial' --output text > example-key.pem $ chmod 400 example-key.pem
- 事前準備 AMI EC2 コンソールの AMI カタログで AMI ID を確認
- AWS CLI からも探せるが大変なので画面で確認
- AWS CLI からも探せるが大変なので画面で確認
なかなかやることが多いですが、完了です。
ちなみに、今更ながら AWS で頻出する AMI の略が途中で気になってしまい調べてみると、 Amazon Machine Image でした。
では、 EC2 インスタンスを立ち上げてましょう!
- EC2 インスタンスを作成 → InstanceId を保存
$ aws ec2 run-instances \ --image-id ami-************* \ --security-group-ids $SGID \ --subnet-id $SUBNETID \ --instance-type t2.micro \ --key-name example-key { "Groups": [], "Instances": [ { "AmiLaunchIndex": 0, "ImageId": "ami-*************", "InstanceId": "i-****************", "InstanceType": "t2.micro", "KeyName": "example-key", # 略 } ] } $ export INSTANCEID=i-****************
無事に立ち上がりました。
最後に EC2 インスタンスに ssh ログインし、 Web サーバにしましょう。
- パブリック IP を確認
- PublicIpAddress を確認
$ aws ec2 describe-instances --instance-ids $INSTANCEID { "Reservations": [ { "Groups": [], "Instances": [ { # 中略 "PublicIpAddress": "**.***.**.***", # 中略 } ] } ] }
- EC2 インスタンスに ssh ログイン
$ ssh -i example-key.pem ec2-user@**.***.**.*** __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/
- Apache をインストールして起動
ブラウザでパプリック IP を入力すると、 Apache の初期画面が無事に表示されました。
最後にデモとして、
- EC2 インスタンス起動時に、シェルスクリプトファイルをユーザデータ –user-data に入れると自動で Apache が起動する処理
- jq ( JSON の操作を簡単に行うライブラリ) を使って AWS CLI のレスポンスから InstanceId を抽出 → 複数の EC2 インスタンスをシェルスクリプトの for 文を使って一括終了処理
こちらを紹介いただいたところで、このコースは修了しました。
まとめ
AWS をコマンドラインで操作する AWS CLI の基本コマンドを実際に試してみました。
正直に言うと、 S3 バケットや EC2 インスタンスの演習だけでは、マネジメントコンソールと比べてそれほどメリットを感じませんでした。 ただ、最後のデモで自動処理する様子をみて、 AWS CLI は「 AWS におけるシェルスクリプト」という位置づけだと気づきました。
そこで、この先に何があるのか気になり、タイトルにある CloudFormation を調べると、テンプレートから設定ファイルを書き、宣言的にその設定ファイルをもとに実行すると、 AWS の各種サービスが自動構築される代物でした( Terraform と同じ)。
AWS CloudFormation の設定ファイルに AWS CLI のコマンドは書きませんが、そもそも実行環境として AWS CLI を使うほか、最後に大澤さんにデモいただいたようにシェルスクリプトと AWS CLI を組み合わせた実行方法もあり、 AWS CLI を知らないことには進めないものでした。
まさしく、このコースは AWS CloudFormation = AWS を使った IaC の最初のステップとなるコースでした!
label SEカレッジを詳しく知りたいという方はこちらから !!
IT専門の定額制研修 月額 28,000 円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 講座をほぼ毎日開催中!!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。