yum -y updateしたらError: Cannot retrieve repository metadata (repomd.xml) for repository:となった時の対応方法

- 環境
    - AWS上に作ったインスタンス : Red Hat Enterprise Linux Server release 5.11
    - OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

# 事象 : yum -y updateしたら怒られた
```bash
$ sudo yum -y update
Loaded plugins: amazon-id, fastestmirror, rhui-lb, security
Loading mirror speeds from cached hostfile
 * rhui-REGION-client-config-server-5: rhui2-cds01.ap-northeast-1.aws.ce.redhat.com
 * rhui-REGION-rhel-server: rhui2-cds01.ap-northeast-1.aws.ce.redhat.com
https://rhui2-cds01.ap-northeast-1.aws.ce.redhat.com/pulp/repos//rhui-client-config/rhel/server/5/x86_64/os/repodata/repomd.xml: [Errno 14] HTTP Error 401: Auth orization Required
Trying other mirror.
https://rhui2-cds02.ap-northeast-1.aws.ce.redhat.com/pulp/repos//rhui-client-config/rhel/server/5/x86_64/os/repodata/repomd.xml: [Errno 14] HTTP Error 401: Authorization Required
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: rhui-REGION-client-config-server-5. Please verify its path and try again
```

# 原因1 : リポジトリが有効になっているから？
- [yumで「Cannot retrieve repository metadata」エラーが出るときは － ＠IT](https://www.atmarkit.co.jp/flinux/rensai/linuxtips/a118yumerror.html)
- 原因の切り分け
    - 対象のリポジトリが不要なものであれば原因はこれでOK。
    - 必要なものの場合は無効にしても結局意味はないので別の原因を探る。

## 対応 : 不要なリポジトリであれば無効にする

```bash
# 1. メッセージから対象っぽい.repoファイルを開く
$ vi /etc/yum.repo.d/redhat-rhui-client-config.repo

# 2. ファイル末尾に以下を追記して保存する
enabled=0

# 3. もう一度トライするとできる
$ sudo yum -y update
Loaded plugins: amazon-id, fastestmirror, rhui-lb, security
Loading mirror speeds from cached hostfile
 * rhui-REGION-rhel-server: rhui2-cds01.ap-northeast-1.aws.ce.redhat.com
rhui-REGION-rhel-server                                                                                                                                                                                               | 3.4 kB     00:00
rhui-REGION-rhel-server/primary_db                                                                                                                                                                                    |  12 MB     00:00
Excluding Packages from Red Hat Enterprise Linux Server 5 (RPMs)
Finished
Skipping security plugin, no data
Setting up Update Process
Resolving Dependencies
Skipping security plugin, no data
--> Running transaction check
---> Package at.x86_64 0:3.1.8-84.el5_11.1 set to be updated
...........省略
```

# 暫定原因2 : 請求コードの情報(billingProducts)が抜けているから？
- [RHELインスタンスだとyumが使えない？ - Qiita](https://qiita.com/i-k/items/d5075c2d73dca1d02593)
- 原因の切り分け
    - スナップショットからAMIを作成し、そのAMIからインスタンスを作成した場合に`billingProducts`が抜けてしまう。
    - `curl http://169.254.169.254/latest/dynamic/instance-identity/document` で `billingProducts` が `null` 担っている場合はこれが原因。

```bash
# billingProductsは設定されているので今回の原因ではない
$ curl http://169.254.169.254/latest/dynamic/instance-identity/document
{
  "accountId" : "xxxxxxxxxxxxxxxxxxx",
  "availabilityZone" : "ap-northeast-1a",
  "kernelId" : "aki-176bf516",
  "ramdiskId" : null,
  "pendingTime" : "2019-05-21T00:19:02Z",
  "architecture" : "x86_64",
  "privateIp" : "xx.0.x.xx",
  "version" : "2017-09-30",
  "devpayProductCodes" : null,
  "marketplaceProductCodes" : null,
  "imageId" : "ami-0xxxxxxxxxxx",
  "billingProducts" : [ "bp-xxxxx" ],
  "instanceId" : "i-xxxxxxxxxxxxxxx",
  "instanceType" : "m2.4xlarge",
  "region" : "ap-northeast-1"
}
```

# 暫定原因3 : 名前解決できていないから？
- [【解決方法】yumを実行した時の「Cannot retrieve repository metadata (repomd.xml) for repository」 - フラミナル](https://blog.framinal.life/entry/2017/07/11/014539)
- 原因の切り分け
    - `curl: (6) Couldn't resolve host 'URL'` のようなメッセージが表示されるとこれが原因の可能性がある

```bash
# 名前解決できていないわけではないらしい
$ curl https://rhui2-cds01.ap-northeast-1.aws.ce.redhat.com/pulp/repos//rhui-client-config/rhel/server/5/x86_64/os/repodata/repomd.xml
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
...省略
```

## 暫定対応 : hostsにリポジトリサーバを定義する
今回は違うけどもしこれが原因だったら・・・
1. `xxx.repo` ファイル内のURLからIPアドレスを調べる
2. AWSのRHLEの場合：URLの`REGION`となっているところをリージョン名的なものに置き換える
3. [ドメイン/IPアドレス サーチ 【whois情報検索】](https://www.cman.jp/network/support/ip.html)でIPアドレスを調べる
4. `/etc/hosts` に書く

# 暫定原因4 : サーバの証明書が古いから？
これが原因っぽいが・・・うまく解決できない・・・

```bash
$ curl https://rhui2-cds01.ap-northeast-1.aws.ce.redhat.com/pulp/repos//rhui-client-config/rhel/server/5/x86_64/os/repodata/repomd.xml
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). The default
 bundle is named curl-ca-bundle.crt; you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

$ curl -k https://rhui2-cds01.ap-northeast-1.aws.ce.redhat.com/pulp/repos//rhui-client-config/rhel/server/5/x86_64/os/repodata/repomd.xml
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<hr>
<address>Apache/2.2.15 (Red Hat) Server at rhui2-cds01.ap-northeast-1.aws.ce.redhat.com Port 443</address>
</body></html>
```

## 試行錯誤
> RHEL系の場合は /etc/pki/tls/certs/ca-bundle.crt はopensslパッケージに含まれているので、手動でごちゃごちゃ頑張らなくても、yum update openssl をすればca-bundle.crtも更新されるはず。
> [サーバのSSL CA(認証局)証明書が古くてcurl がエラーになる件 - うまいぼうぶろぐ](https://hogem.hatenablog.com/entry/20120705/1340284071)

1. OpenSSLを新しくすればいいと思った。
2. yumでupdateはできないので、[OpenSSL をソースからビルドする - Qiita](https://qiita.com/silverskyvicto/items/dca3d4b985829b4b5f1f)を参考にtarファイルをWinSCPでサーバに持ち込んでビルドしようと思った。
3. `$ yum -y remove openssl` を実行したところ`cat`や`vi`コマンドまでなくなった
4. そしてインスタンス自体が `/bin/sh: ro: No such file or directory Kernel panic - not syncing: Attempted to kill init!` で起動しなくなった・・・・さよならインスタンス