【アップデート】Amazon ECS-optimized Amazon Linux 2022 AMIがプレビューとして利用可能になりました
コンサル部のとばち(@toda_kk)です。
Amazon ECS on EC2向けに最適化されたAMIであるAmazon ECS-optimized AMIについて、Amazon Linux 2022がプレビューとして利用可能になりました。
早速、Amazon Linux 2022を利用してAmazon ECS on EC2環境を構築してみました。
Amazon Linux 2022とは
Amazon Linux 2022は、AWSが提供するAmazon Linux 2の後継にあたるLinux OSです。2021年11月にプレビューが発表されました。
OSの定期的なリリースサイクルが計画されている他、Amazon Linux 2と比べて高いセキュリティ標準で設定されています。
詳細は下記ページをご参照ください。
ECS-optimized Amazon Linux 2022 AMIを使ってみる
最新のECS-optimized AMI IDは、パブリックに公開されているSystems Manager Parameter Storeに登録されています。Amazon Linux 2022の場合は、下記コマンドで取得できます。
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2022/recommended
ちなみに、過去のものも含めたバージョン情報については、下記ページに記載されています。
上記コマンドを実行して取得したAMI IDを指定して、EC2インスタンスを作成します。
EC2インスタンスをECSクラスターのコンテナインスタンスとして登録する際の手順は、下記のAWS公式ドキュメントに記載されています。
EC2インスタンスをECSクラスターに登録するためには、IAMインスタンスプロファイルで権限を付与する必要があります。通常はecsInstanceRole
を指定すれば問題ありません。
また、ECS-optimized AMIでは設定ファイル/etc/ecs/ecs.config
に項目を追加することでECS環境の設定値を指定できます。EC2インスタンスをECSクラスターに登録するためには、ECS_CLUSTER
にECSクラスター名を指定する必要があります。
こうした初期化の作業は、通常はEC2インスタンスを作成する際にユーザーデータとして登録しておきます。
- Bootstrapping container instances with Amazon EC2 user data - Amazon Elastic Container Service
- Amazon ECS container agent configuration - Amazon Elastic Container Service
例えば、test-ecs
というECSクラスターにEC2インスタンスを登録したい場合は、ユーザーデータに下記のスクリプトを登録します。
#!/bin/bash echo "ECS_CLUSTER=test-ecs" >> /etc/ecs/ecs.config
問題なくEC2インスタンスが起動されると、ECSクラスター側でコンテナインスタンスとして登録されていることが確認できます。
もしEC2インスタンスは起動しているもののECSクラスターに正常に登録されていない場合など、トラブルシューティングの調査の際は、/var/log/ecs/ecs-agent.log
や/var/log/ecs/ecs-init.log
といったログファイルをご参照ください。
ECS-optimized Amazon Linux 2022 AMIの動作環境を確認してみる
実際に起動してみたECS-optimized Amazon Linux 2022の環境を確認してみます。
※2022年4月現在のプレビュー段階での確認となりますので、ご注意ください。
[ec2-user@ip-10-1-0-133 ~]$ uname -a Linux ip-10-1-0-133.ap-northeast-1.compute.internal 5.15.25-14.106.amzn2022.x86_64 #1 SMP Wed Mar 2 19:27:42 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Linux Kernelのバージョンは5.15.25になっています。
[ec2-user@ip-10-1-0-133 ~]$ getenforce Enforcing
SELinuxがデフォルトで有効になっています。
[ec2-user@ip-10-1-0-133 ~]$ systemctl list-unit-files --type=service UNIT FILE STATE VENDOR PRESET acpid.service disabled disabled amazon-ecs-volume-plugin.service enabled disabled amazon-efs-mount-watchdog.service disabled disabled amazon-ssm-agent.service enabled disabled arp-ethers.service disabled disabled auditd.service enabled enabled auth-rpcgss-module.service static - autovt@.service alias - chrony-wait.service disabled disabled chronyd.service enabled enabled cloud-config.service enabled disabled cloud-final.service enabled disabled cloud-init-local.service enabled disabled cloud-init.service enabled disabled console-getty.service disabled disabled container-getty@.service static - containerd.service disabled disabled dbus-broker.service enabled enabled dbus-org.freedesktop.hostname1.service alias - dbus-org.freedesktop.locale1.service alias - dbus-org.freedesktop.login1.service alias - dbus-org.freedesktop.network1.service alias - dbus-org.freedesktop.oom1.service alias - dbus-org.freedesktop.portable1.service alias - dbus-org.freedesktop.resolve1.service alias - dbus-org.freedesktop.timedate1.service alias - dbus.service alias - debug-shell.service disabled disabled dnf-makecache.service static - docker.service disabled disabled dracut-cmdline.service static - dracut-initqueue.service static - dracut-mount.service static - dracut-pre-mount.service static - dracut-pre-pivot.service static - dracut-pre-trigger.service static - dracut-pre-udev.service static - dracut-shutdown.service static - ecs.service enabled disabled emergency.service static - fstrim.service static - getty@.service enabled enabled grub-boot-indeterminate.service static - grub2-systemd-integration.service static - gssproxy.service disabled disabled import-state.service enabled enabled initrd-cleanup.service static - initrd-parse-etc.service static - initrd-switch-root.service static - initrd-udevadm-cleanup-db.service static - irqbalance.service enabled enabled kmod-static-nodes.service static - ldconfig.service static - loadmodules.service disabled disabled logrotate.service static - man-db-cache-update.service static - man-db-restart-cache-update.service disabled disabled modprobe@.service static - nfs-blkmap.service disabled disabled nfs-convert.service enabled disabled nfs-idmapd.service static - nfs-mountd.service static - nfs-server.service disabled disabled nfs-utils.service static - nfsdcld.service static - nis-domainname.service disabled disabled pam_namespace.service static - policy-routes@.service static - quotaon.service static - rc-local.service static - rdisc.service disabled disabled refresh-policy-routes@.service static - rescue.service static - rngd.service enabled enabled rpc-gssd.service static - rpc-statd-notify.service static - rpc-statd.service static - rpcbind.service disabled disabled rpmdb-rebuild.service disabled enabled rsyslog.service enabled enabled selinux-autorelabel-mark.service enabled enabled selinux-autorelabel.service static - selinux-check-proper-disable.service disabled disabled serial-getty@.service indirect disabled sshd-keygen@.service disabled disabled sshd.service enabled enabled sshd@.service static - stunnel.service disabled disabled stunnel@.service disabled disabled system-update-cleanup.service static - systemd-ask-password-console.service static - systemd-ask-password-wall.service static - systemd-backlight@.service static - systemd-binfmt.service static - systemd-bless-boot.service static - systemd-boot-check-no-failures.service disabled disabled systemd-boot-system-token.service static - systemd-coredump@.service static - systemd-exit.service static - systemd-firstboot.service static - systemd-fsck-root.service enabled-runtime disabled systemd-fsck@.service static - systemd-halt.service static - systemd-hibernate-resume@.service static - systemd-hibernate.service static - systemd-homed-activate.service disabled disabled systemd-homed.service disabled enabled systemd-hostnamed.service static - systemd-hwdb-update.service static - systemd-hybrid-sleep.service static - systemd-initctl.service static - systemd-journal-catalog-update.service static - systemd-journal-flush.service static - systemd-journald.service static - systemd-journald@.service static - systemd-kexec.service static - systemd-localed.service static - systemd-logind.service static - systemd-machine-id-commit.service static - systemd-modules-load.service static - systemd-network-generator.service enabled enabled systemd-networkd-wait-online.service enabled disabled systemd-networkd.service enabled disabled systemd-oomd.service disabled disabled systemd-portabled.service static - systemd-poweroff.service static - systemd-pstore.service disabled enabled systemd-quotacheck.service static - systemd-random-seed.service static - systemd-reboot.service static - systemd-remount-fs.service enabled-runtime disabled systemd-repart.service static - systemd-resolved.service enabled enabled systemd-rfkill.service static - systemd-suspend-then-hibernate.service static - systemd-suspend.service static - systemd-sysctl.service static - systemd-sysext.service disabled disabled systemd-sysusers.service static - systemd-time-wait-sync.service disabled disabled systemd-timedated.service static - systemd-timesyncd.service disabled disabled systemd-tmpfiles-clean.service static - systemd-tmpfiles-setup-dev.service static - systemd-tmpfiles-setup.service static - systemd-udev-settle.service static - systemd-udev-trigger.service static - systemd-udevd.service static - systemd-update-done.service static - systemd-update-utmp-runlevel.service static - systemd-update-utmp.service static - systemd-user-sessions.service static - systemd-userdbd.service indirect disabled systemd-vconsole-setup.service static - systemd-volatile-root.service static - update-motd.service enabled enabled user-runtime-dir@.service static - user@.service static - 158 unit files listed.
登録されているServiceの一覧です。
[ec2-user@ip-10-1-0-133 ~]$ sudo systemctl status amazon-ssm-agent ● amazon-ssm-agent.service - amazon-ssm-agent Loaded: loaded (/etc/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2022-04-29 03:29:57 UTC; 1h 25min ago Main PID: 2137 (amazon-ssm-agen) Tasks: 33 (limit: 4672) Memory: 108.9M CPU: 14.858s CGroup: /system.slice/amazon-ssm-agent.service ├─2137 /usr/bin/amazon-ssm-agent ├─2184 /usr/bin/ssm-agent-worker ├─5809 /usr/bin/ssm-session-worker xxxxxxxxxx-1234567890xxxxxxx └─5822 sh Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:57 INFO [amazon-ssm-agent] using named pipe channel for IPC Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:57 INFO [amazon-ssm-agent] amazon-ssm-agent - v3.1.1260.0 Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:57 INFO [amazon-ssm-agent] OS: linux, Arch: amd64 Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:57 INFO [CredentialRefresher] Identity does not require credential refresher Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:58 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker is not running, starting worker process Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:58 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker (pid:2184) started Apr 29 03:29:58 ip-10-1-0-133.ap-northeast-1.compute.internal amazon-ssm-agent[2137]: 2022-04-29 03:29:58 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Monitor long running worker health every 60 seconds Apr 29 03:32:43 ip-10-1-0-133.ap-northeast-1.compute.internal sudo[2689]: ssm-user : TTY=pts/0 ; PWD=/usr/bin ; USER=root ; COMMAND=/usr/bin/su ec2-user - Apr 29 04:18:34 ip-10-1-0-133.ap-northeast-1.compute.internal sudo[5823]: ssm-user : TTY=pts/1 ; PWD=/usr/bin ; USER=root ; COMMAND=/usr/bin/view /etc/ecs/ecs.config Apr 29 04:28:32 ip-10-1-0-133.ap-northeast-1.compute.internal sudo[7613]: ssm-user : TTY=pts/1 ; PWD=/usr/bin ; USER=root ; COMMAND=/usr/bin/su
SSMエージェントがインストール済みとなっています。デフォルトでSession ManagerやECS Execなども利用できそうです。
[ec2-user@ip-10-1-0-133 ~]$ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2022-04-29 03:29:59 UTC; 1h 28min ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Process: 2139 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS) Process: 2144 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS) Main PID: 2147 (dockerd) Tasks: 10 (limit: 4672) Memory: 447.7M CPU: 11.018s CGroup: /system.slice/docker.service └─2147 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536 Apr 29 03:29:59 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T03:29:59.200134741Z" level=info msg="Loading containers: done." Apr 29 03:29:59 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T03:29:59.491759012Z" level=info msg="Docker daemon" commit=b0f5bc3 graphdriver(s)=overlay2 version=20.10.7 Apr 29 03:29:59 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T03:29:59.500950049Z" level=info msg="Daemon has completed initialization" Apr 29 03:29:59 ip-10-1-0-133.ap-northeast-1.compute.internal systemd[1]: Started Docker Application Container Engine. Apr 29 03:29:59 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T03:29:59.578671440Z" level=info msg="API listen on /run/docker.sock" Apr 29 03:29:59 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T03:29:59.878678952Z" level=warning msg="Your kernel does not support memory swappiness capabilities or the cgroup is not mounted. Memory swappiness discarded." Apr 29 04:25:28 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T04:25:28.514842411Z" level=info msg="ignoring event" container=cb087f85db1f28a7030af81941525e030a7c833780e831f5a9e3216772f1a499 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete" Apr 29 04:26:59 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T04:26:59.030850035Z" level=info msg="ignoring event" container=fdfa5b0ddcea699ae483c4cd4b995c5126c167cbbdf737c7acdf89cbccc51105 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete" Apr 29 04:27:08 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T04:27:08.963142959Z" level=info msg="ignoring event" container=2bf315e59ff1ebd9416174061eb2eff927f4386944534fd92a34a1caa0ae202f module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete" Apr 29 04:27:19 ip-10-1-0-133.ap-northeast-1.compute.internal dockerd[2147]: time="2022-04-29T04:27:19.358866821Z" level=info msg="ignoring event" container=aec109a393eafa680196393d16e5130b2b8fb6923bf1cf611bd9c61173e1d855 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
もちろん、Dockerもインストール済みとなっています。
Amazon Linux 2022のGAに向けた事前の検証目的などでご利用ください
2022年4月現在、Amazon Linux 2022自体がまだプレビューの段階です。
Amazon ECS on EC2環境でAmazon Linux 2などのECS-optimized AMIをご利用中の場合、将来的にAmazon Linux 2022に移行する可能性があるかと思いますので、現状ではGAに向けた事前の検証目的などでご利用ください。
また、Amazon Linuxの他に、コンテナをホストすることに特化した軽量OSとしてBottlerocketがあります。こちらもセキュリティ面などで利点が大きいので、併せてご検討してみてください。
以上、コンサル部のとばち(@toda_kk)でした。