ブラックボックス

プログラミングのノウハウやライフハックをどんどん投稿していきたい

Oct 26, 2022 - 3 minute read - ノウハウ

【AWS】自作AMIからEC2インスタンス作成後、ネットワークに繋がらなった時に試したこと

AMIからEC2インスタンスをいくつも作れるのは便利ですが、作成後にネットワークにつながらない為、該当のEC2インスタンスにSSH接続も出来ずに詰みかけたことがありました。
ネットワークが繋がるよう対処した時のログを残しておきます。

環境:

  • OS:CentOS 7.9-2009

SSH接続が出来ず何も操作が出来ない為、AWSコンソールでシリアルコンソールでマシンを操作します。

EC2 > インスタンス > 該当のインスタンスを選択 > アクション > モニタリングとトラブルシューティング > EC2 シリアルコンソール

インスタンスによっては以下のように権限不足の警告が出ることがありますが、Manage accessから権限を付与してやることでアクセスが可能となります。
試した中では、t3系のインスタンスタイプだと権限不足、m5系だと権限がありました。

シリアルコンソールを起動すると、以下のようなログが大量に流れます。

[   65.935299] cloud-init[862]: 2022-10-23 02:41:24,043 - DataSourceEc2.py[WARNING]: Unable to get API token: None/latest/api/token raised exception ('Connection aborted.', gaierror(-2, 'Name or service not known'))
[   65.940495] cloud-init[862]: 2022-10-23 02:41:24,049 - url_helper.py[WARNING]: Calling 'http://169.254.169.254/2009-04-04/meta-data/instance-id' failed [34/120s]: request error [('Connection aborted.', error(101, 'Network is unreachable'))]

169.254.169.254 はAWSが用意しているメタデータを取得するサーバです。
参考:インスタンスメタデータの取得
このサーバに接続が出来ないというエラーが頻発していました。

その後、

[FAILED] Failed to start LSB: Bring up/down networking.
See 'systemctl status network.service' for details.

といった具合に、ネットワークでエラーのログが出ます。

詳細を見るならステータスを確認しろ、と言われたので確認、ついでにIPアドレスも確認してみます。

$ sudo systemctl status network.service
● network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2022-10-23 11:42:18 JST; 2min 12s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1095 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=1/FAILURE)

Oct 23 11:42:18 hostname network[1095]: RTNETLINK answers: File exists
Oct 23 11:42:18 hostname network[1095]: RTNETLINK answers: File exists
Oct 23 11:42:18 hostname network[1095]: RTNETLINK answers: File exists
Oct 23 11:42:18 hostname network[1095]: RTNETLINK answers: File exists
Oct 23 11:42:18 hostname network[1095]: RTNETLINK answers: File exists
Oct 23 11:42:18 hostname network[1095]: RTNETLINK answers: File exists
Oct 23 11:42:18 hostname systemd[1]: network.service: control proces...1
Oct 23 11:42:18 hostname systemd[1]: Failed to start LSB: Bring up/d....
Oct 23 11:42:18 hostname systemd[1]: Unit network.service entered fa....
Oct 23 11:42:18 hostname systemd[1]: network.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 0a:b8:0a:4e:d8:55 brd ff:ff:ff:ff:ff:ff

ネットワークに異常がありサービスが起動できず、プライベートIPアドレスも付与されていませんでした。

そこで、ネットワークの設定ファイルを開き、設定を変更します。
今回はインタフェース名が eth0 なので、対象は ifcfg-eth0 というファイル名となります。

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

中身は以下のようになっていました(HWADDR辺りは環境により異なります)。

# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth0
HWADDR=06:1f:c0:7e:a9:a1
ONBOOT=yes
STARTMODE=auto
TYPE=Ethernet
USERCTL=no

結論、今回はMACアドレスが悪さをしていたので、この設定をばっさり削除してしまいます。
HWADDRのある5行目を行ごと削除し、以下のようにします。

# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth0
ONBOOT=yes
STARTMODE=auto
TYPE=Ethernet
USERCTL=no

その後ネットワークサービスを再起動し、状態を確認します。

$ sudo systemctl restart network

$ sudo systemctl status network.service
● network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
   Active: active (running) since Fri 2022-10-23 11:47:21 JST; 7s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1657 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/network.service
           └─1841 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.l...

Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname network[1657]: RTNETLINK answers: File exists
Oct 23 11:47:21 hostname systemd[1]: Started LSB: Bring up/down netw....
Hint: Some lines were ellipsized, use -l to show in full.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 0a:b8:0a:4e:d8:55 brd ff:ff:ff:ff:ff:ff
    inet 172.32.16.100/21 brd 172.16.31.255 scope global dynamic eth0
       valid_lft 3581sec preferred_lft 3581sec
    inet6 fe80::8b8:aff:fe4e:d855/64 scope link 
       valid_lft forever preferred_lft forever

問題なくサービスが起動し、プライベートIPアドレスが付与されました。
AWSコンソール側でElasticIPを付与していると外部からSSH接続が可能となります。