AWS Lightsail で運用してた個人用ブログの終活作業履歴②

[AWS Lightsail で運用してた個人用ブログの終活作業履歴①](https://qiita.com/imo_tikuwa/items/ec9ca25593075a905888) の続きです

前回実施したのは以下の4手順です
```
1. 切替先となる Route 53 のホストゾーン作成
2. 既存の DNS レコード設定情報を参考に Route 53 のレコード設定
3. ネームサーバーを お名前.com → Route 53 に切り替え
4. ACM 証明書を発行
```

今回は続きとしてACM関連の残作業を実施します
```
5. 既存のサーバーレスアプリケーションに設定中のACM証明書の切替
6. 不要となった方のACM証明書を削除
```

以下は残課題
```
7. Lightsail内で稼働中のWordPressサイト、その他をバックアップ
8. WordPressサイトについてローカルでの動作環境を構築
9. Lightsailインスタンスを削除
10. Route 53 レコード設定から Lightsail インスタンスのIPv6に向けた設定を削除
```

## 5. 既存のサーバーレスアプリケーションに設定中のACM証明書の切替、不要となった方のACM証明書を削除

既存の CloudFront ディストリビューションに設定中のカスタムSSL証明書について、certbotで発行し手動インポートしたものから、ACMのサービス上で発行した証明書に付け替えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/38c1f90a-ee7e-4112-a9bb-bd735130faa5.png)

---

最初に CloudFront ディストリビューションの一覧情報の中からディストリビューションごとの一意なIDを取得

```bash:CloudShell で CloudFront ディストリビューションのIDの一覧を取得
$ aws cloudfront list-distributions | jq '.DistributionList.Items[].Id'
"E************1"
```

- 私の AWS アカウントには CloudFront ディストリビューションは1つのみ存在するため、↑のコマンドで更新対象のIDを取得できました

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/list-distributions.html

---

次に CloudFront ディストリビューションの ID を元に ETag という一意なタグを取得

```bash:CloudShell で CloudFront ディストリビューションの ETag 情報を取得
$ aws cloudfront get-distribution-config --id E************1 | jq '.ETag'
"E***********3"
```

- この値は後述する `update-distribution` コマンドで ID とは別に必要となる

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/get-distribution-config.html

---

再度 `get-distribution-config` コマンドを実行し、今度は Etag とは異なるキーで管理されている DistributonConfig 情報を取得

```bash:CloudShell で CloudFront ディストリビューションの DistributionConfig 情報を取得
$ aws cloudfront get-distribution-config \
  --id E************1 \
  | jq '.DistributionConfig' > config.json
```

- DistributionConfig の情報は更新コマンドの中で入力として必要となるため `config.json` という名前でカレントに保管します

---

CloudShell 上で `config.json` を編集

```json:config.json 抜粋
{
~~~ 省略 ~~~
  "ViewerCertificate": {
    "CloudFrontDefaultCertificate": false,
    "ACMCertificateArn": "arn:aws:acm:us-east-1:************:certificate/********-****-****-****-************",
    "SSLSupportMethod": "sni-only",
    "MinimumProtocolVersion": "TLSv1.2_2021",
    "Certificate": "arn:aws:acm:us-east-1:************:certificate/********-****-****-****-************",
    "CertificateSource": "acm"
  }
~~~ 省略 ~~~
}
```

- `ViewerCertificate.ACMCertificateArn` と `ViewerCertificate.Certificate` に記載されている ARN についてACMサービス上で新規作成したARNに差し替えて保存
- エディタは nano と vi が使えたので好きな方を使っていいと思います（vi を使用）

---

編集した `config.json` を元に CloudFront ディストリビューションを更新

```bash:CloudShell で CloudFront ディストリビューションを更新
$ aws cloudfront update-distribution \
  --id E************1 \
  --if-match E***********3 \
  --distribution-config file://config.json
```

- `--id` で渡している値が CloudFront ディストリビューションのID
- `--if-match` で渡してる値が ETag

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/update-distribution.html

---

ACM の証明書一覧で「使用中ですか？」の列の表示が切り替わったことを確認できました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/d69cf73e-f874-4359-85c6-124e580a3b75.png)

- 更新の適格性もACMのサービス上で発行した証明書のため「対象（自動更新が可能な状態）」となりました:relaxed:
- CloudFront ディストリビューションの方でも切り替わってることを確認
- アプリケーション自体にもブラウザアクセスして問題なく閲覧できることを確認

---

ブラウザでアクセスしたときのSSL証明書の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/5f8193e4-2f25-4911-9a99-611d9f459cff.png)

- 認証局がLetsEncrypt ⇒ Amazon になりました


## 6. 不要となった方のACM証明書を削除

`acm list-certificates` コマンドを使用して削除対象のACM証明書のARNを確認します

```bash:CloudShell で不要となった方のACM証明書を削除
$ aws acm list-certificates \
  --includes keyTypes=RSA_2048,EC_prime256v1 \
  | jq '.CertificateSummaryList[] | select(.Type == "IMPORTED")'
{
  "CertificateArn": "arn:aws:acm:us-east-1:************:certificate/********-****-****-****-************",
  "DomainName": "imo-tikuwa.com",
  "SubjectAlternativeNameSummaries": [
    "imo-tikuwa.com",
    "*.imo-tikuwa.com"
  ],
  "HasAdditionalSubjectAlternativeNames": false,
  "Status": "ISSUED",
  "Type": "IMPORTED",
  "KeyAlgorithm": "EC-prime256v1",
  "KeyUsages": [
    "DIGITAL_SIGNATURE"
  ],
  "ExtendedKeyUsages": [
    "TLS_WEB_SERVER_AUTHENTICATION",
    "TLS_WEB_CLIENT_AUTHENTICATION"
  ],
  "InUse": false,
  "RenewalEligibility": "INELIGIBLE",
  "NotBefore": "2025-03-30T12:19:41+00:00",
  "NotAfter": "2025-06-28T12:19:40+00:00",
  "CreatedAt": "2023-06-01T14:51:27.469000+00:00",
  "ImportedAt": "2025-03-31T12:53:16.301000+00:00"
}
```

- ドキュメントによるとデフォルトで一覧情報として取得可能なACM証明書はキーアルゴリズムが `RSA_1024` と `RSA_2048` のいずれかのもののみに限定されてました
  - `--includes` オプションで `keyTypes=RSA_2048,EC_prime256v1` のように取得したいキーアルゴリズムを明示することで certbot で発行してACMに手動インポートした方の証明書情報を取得できました
- CertificateSummaryList リスト内の Type が `IMPORTED` となっているのが手動インポートした証明書です。jq コマンドによるフィルタリングによって削除対象を抽出しました
  - ちなみにACMサービス上でリクエスト→検証を済ませた証明書は `AMAZON_ISSUED` になってました

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm/list-certificates.html

---

↑ で取得した情報に含まれる CertificateArn の値を元にACM証明書の削除を実施

```bash:CloudShell でACM証明書を削除
$ aws acm delete-certificate \
  --certificate-arn "arn:aws:acm:us-east-1:************:certificate/********-****-****-****-************"
```

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm/delete-certificate.html

---

削除後、ACM 証明書の一覧画面に表示される証明書が1つになったことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/22b7469c-e0c4-475e-897e-5014210639cf.png)

---

ACM 証明書に関する作業が一通り完了しました。

## 参考サイト

今回使用した aws-cli に関するドキュメントは以下

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/list-distributions.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/get-distribution-config.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/update-distribution.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm/list-certificates.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm/delete-certificate.html