Amazon Linux 2023が出たのでAWS CLI v2を入れ直す必要がなくなった

# はじめに
- Amazon Linux 2023が[GA](https://aws.amazon.com/jp/about-aws/whats-new/2023/03/amazon-linux-2023/)となりました。
- これまでAmazon Linux 2を使っていて個人的に地味に面倒だったのが、Amazon Linux 2はデフォルトでAWS CLI v1系がインストールされているのでAWS CLI v2系を使うためにはインストールし直す必要があったという点でした。
- Amazon Linux 2023では、デフォルトでAWS CLI v2系がインストールされているので、この入れ直しが不要になりました。
- ということで、ちょっとした検証でEC2インスタンスなどを立てるときに使っていたCloudFormationのテンプレートを更新します。

# 更新前
- このようにCloudFormationテンプレートの`Parameter`でAmazon Linux 2をデフォルトのAMIとして指定していました。（以下yamlは説明しやすくするために色々省略してます。）
    - `Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2`の部分です。
```yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Deploys a new VPC with 3 public subnets and a EC2 instance for the bastion host in ap-northeast-1.
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Basic configuration
        Parameters:
          - NamePrefix
          - EC2Image
          - KeyPairName
    ParameterLabels:
      NamePrefix:
      EC2Image:
        default: AMI ID for the bastion host
Parameters:
  EC2Image:
    Description: AMI ID of an EC2 instance.
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2
```


- そして、EC2インスタンスの`UserData`でAWS CLI v1をアンインストールして、v2を再インストールしていました。（以下yamlは説明しやすくするために色々省略してます。）
```yaml
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Sub "${EC2Image}"
      InstanceType: t3.micro
      AvailabilityZone: "ap-northeast-1a"
      Tags:
        - Key: "Name"
          Value: !Sub "${NamePrefix}-instance"
      KeyName: !Sub "${KeyPairName}"
      SecurityGroupIds:
        - !Ref SecurityGroupforEC2Instance
      SubnetId: !Ref Subnet1
      IamInstanceProfile: !Ref InstanceProfileForEC2Instance
      UserData:
        Fn::Base64: !Sub
          - |
            #!/bin/bash
            yum remove awscli -y
            curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
            unzip awscliv2.zip
            ./aws/install -i /usr/local/aws-cli -b /usr/local/bin
            aws configure set region ap-northeast-1
            yum update -y
            hostnamectl set-hostname ${Prefix}-instance
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
          - {
              Prefix: !Ref NamePrefix
            }
```

# 更新後
- `Parameter`で指定していたAMI IDを取得するパラメータをAmazon Linux 2023のものに変更します。
    - `Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2` → `Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64`
```yaml
Parameters:
  EC2Image:
    Description: AMI ID of an EC2 instance.
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
```
:::note info
AMI IDを取得するパラメータはAWS Systems Managerもしくは[こちら](https://aws.amazon.com/jp/blogs/aws/amazon-linux-2023-a-cloud-optimized-linux-distribution-with-long-term-support/)から確認可能です。`/aws/service/ami-amazon-linux-latest/<alias>`の`<alias>`部分を以下のどれかに置き換えます。
- For arm64 architecture (standard AMI): `al2023-ami-kernel-default-arm64`
- For arm64 architecture (minimal AMI): `al2023-ami-minimal-kernel-default-arm64`
- For x86_64 architecture (standard AMI): `al2023-ami-kernel-default-x86_64`
- For x86_64 architecture (minimal AMI): `al2023-ami-minimal-kernel-default-x86_64`
:::

- そして、EC2インスタンスの`UserData`でAWS CLI v1のアンインストール、v2をインストールしていた部分を削除。スッキリしました。
```yaml
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Sub "${EC2Image}"
      InstanceType: t3.micro
      AvailabilityZone: "ap-northeast-1a"
      Tags:
        - Key: "Name"
          Value: !Sub "${NamePrefix}-instance"
      KeyName: !Sub "${KeyPairName}"
      SecurityGroupIds:
        - !Ref SecurityGroupforEC2Instance
      SubnetId: !Ref Subnet1
      IamInstanceProfile: !Ref InstanceProfileForEC2Instance
      UserData:
        Fn::Base64: !Sub
          - |
            #!/bin/bash
            aws configure set region ap-northeast-1
            yum update -y
            hostnamectl set-hostname ${Prefix}-instance
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
          - {
              Prefix: !Ref NamePrefix
            }
```

# 動作確認
- CloudFormationスタックを作成して、EC2インスタンスを起動し、SSHでログインしてみます。
- OSバージョンは以下の通り、Amazon Linux 2023。
```bash
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
VERSION_ID="2023"
PLATFORM_ID="platform:al2023"
PRETTY_NAME="Amazon Linux 2023"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023"
HOME_URL="https://aws.amazon.com/linux/"
BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023"
SUPPORT_END="2028-03-01"
```
- インストールされているAWS CLIのバージョンは2.2.19。
```bash
$ aws --version
aws-cli/2.9.19 Python/3.9.16 Linux/6.1.15-28.43.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off
```
- 無事に動作確認できたので、CloudFormationのテンプレートのメンテナンスは完了です。

# 追記（注意事項）
- Amazon Linux 2023の情報を調べていたらこんなブログを発見しました。
    - [Amazon Linux 2023 に Teraterm から SSH 接続してみた : ssh-rsa 署名無効化対応](https://qiita.com/sugimount-a/items/78b5c02d4c286b7c266b)
- セキュリティ周りのアップデートでAmazon Linux 2023へのSSH時に`ssh-rsa`署名が使えなくなったので、Teratermを使う場合は 5.0 beta 1以上を使う必要があるとのこと。
- Windowsユーザーですが、PowerShellのsshコマンドを使って確認しており問題なく接続できていたので気づきませんでしたが、改めてTeraterm（version 4.106）で接続してみると確かに認証が通りませんでした。要注意ですね。

# まとめ
- Amazon Linux 2023がGAとなり、Amazon LinuxでAWS CLI v2を使いたいときにAWS CLI v1をアンインストールしてv2をインストールする必要がなくなりました。
- というわけで、個人の検証用CloudFormationテンプレートを更新しました。
- テンプレートは[こちら](https://github.com/seijitanabe/my-cfn-templates)に置いてあります。完全に自分用ですので、もしご利用の際は自己責任でお使いください。