AWSのサービスをAWS CloudShell で操作する

この記事は[ラクスAdvent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus) 6日目の記事です。

現場でAWS CloudShell を扱う機会がありましたので、その時に使用したものなどを書かせていただきます。

この記事がAWS CloudShellを知るきっかけになれば幸いです。

# AWS CloudShell とは
ブラウザから触れるコマンドラインになります。
AWS サービスに対して AWS CLI コマンドを実行できます。
コマンドラインツールのダウンロードもインストールも不要でaws cli やコンテナサービスのcliなど予めインストールされています。

# AWS CloudShell の特徴
* Amazon Linux 2ベースの環境
* ファイルをアップロード、ダウンロード可能
* ストレージは1GB
* コマンドラインシェルを切り替えることが出来る（Bash、PowerShell、Z Shell）
* AWSのGUIはデザインが時々変更され使いにくくなることもあるが、こちらはコマンドが正しければ同じように設定出来る

# 起動方法
ブラウザからAWSにログイン後、検索欄の右にある`>_`か、サービスの`CloudShell`から起動
![スクリーンショット (189).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242276/b8a591d1-8e77-9b3d-b396-6b65ee4d1b07.png)
起動後は以下のような画面が表示されます。
![スクリーンショット (190).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242276/f4775226-b73a-e725-5910-17b44c221583.png)
コマンドのログは自動では保存されないので以下の方法などでログは取得します。
```
$ export TZ="Asia/Tokyo"
$ export PS1="[\u@\h \D{%FT%T} \W]\$"
$ script `date +%Y%m%d`_cloudshell.log
```
これで日付_cloudshell.logのファイルにログが記録されます。
# AWS CloudShellの操作例
CloudShellでAWSを操作するにはAWS CLIを使用します。
AWS コマンドラインインターフェイス (AWS CLI) は、AWS のサービスを管理するための統合ツールです。
コマンドラインから AWS の複数のサービスを制御し、スクリプトを使用してこれらを自動化することができます。
AWS CLI のコマンドについては詳しく調べたい方は[こちら](https://docs.aws.amazon.com/cli/latest/index.html)をご確認ください。

ここでは実際に私が使用したものを一部紹介します。

## 証明書の設定
Certificate Managerへの証明書インポート、EC2のロードバランサーへの証明書適用など
### 証明書のインポート
AWS Certificate Manager (ACM)への証明書のインポート
証明書、中間証明書、キーファイルはブラウザの右上にある`Actions`の`Upload file`からファイルをアップロードして使用
```
$ aws acm import-certificate --certificate fileb:///home/cloudshell-user/<証明書> \
> --certificate-chain fileb:///home/cloudshell-user/<中間証明書> \
> --private-key fileb:///home/cloudshell-user/<キーファイル> \
> --tags Key=<tag>,Value=<name>        #こちらでタグを設定可能
```
問題なければ証明書のARNが表示される。
インポートした証明書の内容は以下で確認できる。
```
$ aws acm describe-certificate --certificate-arn <証明書のARN>
```
### 証明書の適用
ロードバランサーに証明書を適用する
```
$ aws elbv2 add-listener-certificates \
> --listener-arn <ロードバランサーにあるリスナーのARN> \
> --certificates CertificateArn=<証明書のARN>
```
リスナーに適用されている証明書は以下で確認できる。
ただし、適用されている証明書のARNの一覧が表示されるので内容を確認する場合はインポート時に使用した確認コマンドで確認する。
```
$ aws elbv2 describe-listener-certificates \
> --listener-arn <リスナーのARN>
```
### 証明書の削除
リスナーから証明書を削除する場合は以下のようにする。
```
$ aws elbv2 remove-listener-certificates \
> --listener-arn <リスナーのARN> \
> --certificates CertificateArn=<削除する証明書のARN>
```
削除されたかは証明書一覧などから確認する。

## リスナーのルール設定
EC2にあるロードバランサーのリスナーへのルール設定
### ルール一覧表示
設定されているルールの一覧を表示する。
```
$ aws elbv2 describe-rules --listener-arn <リスナーのARN>
```
### ルール作成
リスナーにルールを追加する
※ルールの設定時に`priority`の値を設定しますが、これはルールの優先順位を表します。値が小さいほど優先順位が高くなります。すでにあるルールと優先順位を気を付けなければいけない場合は注意が必要です。
ルールの内容はjsonファイルを読み込んで設定出来ます。
今回はhttpをhttpsにリダイレクトする設定を記載します。
```80_redirect.json
[
  {
    "Type": "redirect",
    "RedirectConfig": {
      "Protocol": "HTTPS",
      "Port": "443",
      "Host": "#{host}",
      "Path": "/#{path}",
      "Query": "#{query}",
      "StatusCode": "HTTP_302"
    }
  }
]
```
```
$ aws elbv2 create-rule --listener-arn <リスナーのARN> \
> --priority 1 \           #priorityの値はすでに使用されている値は設定できません。事前に空いている値を確認してください。
> --conditions Field=host-header,Values=www.hogehoge.com \
> --actions file://80_redirect.json
```
問題なければルールのARNが表示される。
追加したルールの内容は以下で確認できる。
```
$ aws elbv2 describe-rules --rule-arns <ルールのARN>
```
### ルール削除
リスナーのルールを削除する
```
$ aws elbv2 delete-rule --rule-arn <ルールのARN>
```
削除されたかはルール一覧などから確認する。

# 最後に
AWS CloudShell をあまり知らない人もいると思い書きましたが、GUIでの操作の方がわかりやすいと思う人もいると思います。
少しの設定変更であればGUIの方がすぐに出来ますし、スペルミスでerrorが出たりすることもないですしね。
私の場合は、現場での作業で過去のAWSの作業手順書を参考にした時に、昔とGUIのデザインが変わっていて作り直すことになったので、それならデザイン変更の影響を受けないCloudShellでの手順書にしようとしたのがCloudShellを使用し始めたきっかけです。
使い始めはコマンドがよくわからなくて大変でしたが、わかってくると面白いですよ。