ちょっと話題の記事

Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた

2018.01.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Linux 2には Extras Library と呼ばれるパッケージ群が存在し、Python、Golang、MariaDB、Ansible などの特定のパッケージをより新しいバージョンで利用することが出来ます。 Extra Packages for Enterprise Linux (EPEL) のような位置づけで、通常はディストリビューション標準のパッケージを利用する一方で、特定のパケージではより新しいバージョンを試せます。

この特別なパッケージは AWS がキュレートし、amazon-linux-extras コマンド経由で管理します。

今回はこの Extras Library を実際に使ってみます。

Extras Library は amazon-linux-extras コマンドで操作

Extras Library は専用プログラム amazon-linux-extras で操作します。

以下の4つのサブコマンドがあります。

  • help
  • info
  • install
  • list

ヘルプメッセージを表示させてみましょう。

$ amazon-linux-extras help
  help      See list of commands.
  info      See details of a specific package.
  install   Enables specified topics and installs their packages.
  list      Lists topics in the catalog. Some may be enabled.

Amazon Linux Extras software topics give you access to the most-recent
stable software you specifically choose, without the uncertainty of a
wholly new environment.

Best practice is to enable only one or two topics. More than that, and
you lose the benefits of working in a stable environment.

Extras Library の狙いは、安定した基盤にピンポイントで新しいソフトウェアをインストールすることです。 Extras Library 経由のインストールは 1、2個にとどめておくことがベストプラクティスです。

Extras Libraryで利用可能なトピックについて

Extras Library ではソフトウェア群のことを「トピック」と呼びます。

例えば、トピック Rust の場合、ランタイムの Rust だけでなく、パッケージ管理やビルドを担う Cargo もまとめてインストールされます。

利用可能なトピックの一覧は $ amazon-linux-extras list あるいは単に $ amazon-linux-extras コマンドで確認出来ます。

$ amazon-linux-extras
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4   disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2   disabled  [ =7.2.0 ]
 14  lamp-mariadb10.2-php7.2   disabled  [ =10.2.10_7.2.0 ]
  • トピック名(例: ansible2)
  • インストールの有無(例:disabled/enabled)
  • バージョン(2.4.2)

を一覧で確認出来ます。

Rust のような新しいソフトウェアがある一方で nano のような非常にレガシーなソフトウェアもあります。選定基準が気になります。

約1年のトピックの発展を確認

約1年後の 2018/12/17 時点でのトピックを確認します。

$ sudo amazon-linux-extras
  0  ansible2                 available    [ =2.4.2  =2.4.6 ]
  2  httpd_modules            available    [ =1.0 ]
  3  memcached1.5             available    [ =1.5.1 ]
  4  nginx1.12                available    [ =1.12.2 ]
  5  postgresql9.6            available    [ =9.6.6  =9.6.8 ]
  6  postgresql10             available    [ =10 ]
  8  redis4.0                 available    [ =4.0.5  =4.0.10 ]
  9  R3.4                     available    [ =3.4.3 ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2 ]
 11  vim                      available    [ =8.0 ]
 12  golang1.9                available    [ =1.9.2 ]
 13  ruby2.4                  available    [ =2.4.2  =2.4.4 ]
 15  php7.2=7.2.11            available      \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11 ]
  _  php7.1                   available    [ =7.1.22 ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11 ]
 18  libreoffice              available    [ =5.0.6.2_15  =5.3.6.1 ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker                   available    \
        [ =17.12.1  =18.03.1  =18.06.1 ]
 21  mate-desktop1.x          available    [ =1.19.0  =1.20.0 ]
 22  GraphicsMagick1.3        available    [ =1.3.29 ]
 23  tomcat8.5                available    [ =8.5.31  =8.5.32 ]
 24  epel                     available    [ =7.11 ]
 25  testing                  available    [ =1.0 ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    [ =1.8.0_192 ]
 28  firecracker              available    [ =0.11 ]

28トピックと倍増しています。

firecracker のように re:Invent 2018 で発表されたばかりの新ソフトウェアも追加されています。

トピックの詳細を確認

トピックの詳細は $ amazon-linux-extras info TOPIC コマンドで確認出来ます。

Extras Library は YUM でパッケージを管理しており、トピックを指定すると、トピックに紐づく各パッケージがインストールされます。

ruby2.4 の場合

$ amazon-linux-extras info ruby2.4
ruby2.4 recommends ruby                       # yum install ruby
ruby2.4 recommends ruby-irb                   # yum install ruby-irb
ruby2.4 recommends rubygem-rake               # yum install rubygem-rake
ruby2.4 recommends rubygem-json               # yum install rubygem-json
ruby2.4 recommends rubygems                   # yum install rubygems

php7.2 の場合

$ amazon-linux-extras info php7.2
php7.2 recommends php-cli                    # yum install php-cli
php7.2 recommends php-pdo                    # yum install php-pdo
php7.2 recommends php-fpm                    # yum install php-fpm
php7.2 recommends php-json                   # yum install php-json
php7.2 recommends php-mysqlnd                # yum install php-mysqlnd

トピックをインストール

トピックのインストールは $ amazon-linux-extras install TOPIC コマンドを使います。

$ sudo amazon-linux-extras install php7.2
Package php-cli-7.2.0-3.amzn2.1.x86_64 already installed and latest version
Package php-fpm-7.2.0-3.amzn2.1.x86_64 already installed and latest version
Package php-json-7.2.0-3.amzn2.1.x86_64 already installed and latest version
Package php-mysqlnd-7.2.0-3.amzn2.1.x86_64 already installed and latest version
Package php-pdo-7.2.0-3.amzn2.1.x86_64 already installed and latest version
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4   disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2=latest  enabled  [ =7.2.0 ]
 14  lamp-mariadb10.2-php7.2   disabled  [ =10.2.10_7.2.0 ]

$ which php
/usr/bin/php

$ php -v
PHP 7.2.0 (cli) (built: Dec 13 2017 00:38:30) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

$ yum info php-cli
Loaded plugins: langpacks, update-motd
Installed Packages
Name        : php-cli
Arch        : x86_64
Version     : 7.2.0
Release     : 3.amzn2.1
Size        : 14 M
Repo        : installed
From repo   : amzn2extra-php7.2
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.

一覧から php7.2 の状態が disabled が enabled に変わっているのを確認出来ます。

topic=code形式で明示的にトピックのバージョンを指定することも出来ます。

$ sudo amazon-linux-extras install php7.2=7.2.0 golang1.9=1.9.2

バージョンを指定しない場合は、デフォルトのバージョンでインストールされます。

現在はトピックとバージョンは1:1の関係ですが、いずれは、複数のバージョンが選択可能になるものと思われます。

2018/12/17 時点では

  • Rust
  • PHP
  • lamp-mariadb10.2-php7.2
  • Docker

で複数のバージョンから選択可能になっています。

例えば PHP の場合、次の様になっています。

$ amazon-linux-extras
...
 15  php7.2=7.2.11            available      \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11 ]
...

最新バージョンの 7.2.11 をインストールしてみます。

$ sudo amazon-linux-extras install php7.2=7.2.11
...
Installed:
  php-cli.x86_64 0:7.2.11-1.amzn2.0.1                  php-fpm.x86_64 0:7.2.11-1.amzn2.0.1                  php-json.x86_64 0:7.2.11-1.amzn2.0.1                  php-mysqlnd.x86_64 0:7.2.11-1.amzn2.0.1                  php-pdo.x86_64 0:7.2.11-1.amzn2.0.1

Dependency Installed:
  php-common.x86_64 0:7.2.11-1.amzn2.0.1

Complete!
...
 15  php7.2=7.2.11            enabled      \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11 ]
...

amazon-linux-extras コマンド経由では、インストールされているトピックはわかるものの、トピックのバージョンまではわからないようです。

バージョンを知りたい場合は直接プログラムを呼び出して確認しましょう。

$ php -v
PHP 7.2.11 (cli) (built: Oct 24 2018 17:51:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

extras 用レポジトリを有効化

トピックインストールは内部的には extras 用のレポジトリの追加とそのレポジトリ情報を利用したインストールの2段階の操作を行っています。 レポジトリだけを追加したい場合は enable コマンドを利用します。

/etc/yum.repos.d/amzn2-extras.repo ファイルが追加・更新されます。

$ sudo amazon-linux-extras  enable php7.2
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4   disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2=latest  enabled  [ =7.2.0 ]
 14  lamp-mariadb10.2-php7.2   disabled  [ =10.2.10_7.2.0 ]

Now you can install:
 # yum install php-cli php-pdo php-fpm php-json php-mysqlnd

トピックをアンインストール

トピックをアンインストールする手段が現時点では提供されていません。

ソースコードを見る限り disable という隠れ?コマンドが存在するものの、サーバー内にある Extras Libraryの設定ファイルレベルで無効化するだけであり、YUM パッケージレベルで削除されるわけではありません。

$ sudo amazon-linux-extras disable php7.2
Beware that disabling topics is not supported after they are installed.
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4   disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2   disabled  [ =7.2.0 ]
 14  lamp-mariadb10.2-php7.2   disabled  [ =10.2.10_7.2.0 ]
$ php -v
PHP 7.2.0 (cli) (built: Dec 13 2017 00:38:30) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

disable コマンド実行直後にあるメッセージ "Beware that disabling topics is not supported after they are installed." の通りで、コマンド実行結果では disabled となっていますが、パッケージ自体はインストールされたままです。

YUM でインストールされたのだから yum remove 経由でパッケージ単位での削除は可能です。 ただし Extras Library のトピックとしての整合性は崩れてしまうため、AT YOUR OWN RISK で実行して下さい。

$ sudo yum remove php-cli

Loaded plugins: langpacks, update-motd
Resolving Dependencies
--> Running transaction check
---> Package php-cli.x86_64 0:7.2.0-3.amzn2.1 will be erased
--> Finished Dependency Resolution
amzn2-core/2017.12/x86_64                                                                                                                                     | 2.0 kB  00:00:00

Dependencies Resolved

=====================================================================================================================================================================================
 Package                                Arch                                  Version                                        Repository                                         Size
=====================================================================================================================================================================================
Removing:
 php-cli                                x86_64                                7.2.0-3.amzn2.1                                @amzn2extra-php7.2                                 14 M

Transaction Summary
=====================================================================================================================================================================================
Remove  1 Package

Installed size: 14 M
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : php-cli-7.2.0-3.amzn2.1.x86_64                                                                                                                                    1/1
  Verifying  : php-cli-7.2.0-3.amzn2.1.x86_64                                                                                                                                    1/1

Removed:
  php-cli.x86_64 0:7.2.0-3.amzn2.1

Complete!

Extras Library の YUM レポジトリはどこ?

通常のパッケージと Extras パッケージのレポジトリは次のような構造になっています。

  • AL2 通常 : http://amazonlinux.$awsregion.$awsdomain/$releasever/$product/$pointrelease/$basearch/mirror.list
  • AL2 Extra : http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/$extraname/$exactver/$sect/mirror.list

$extraname はトピック名です。ansible2nano などが入ります。 $extraname はトピックのバージョンです。バージョンを指定せずにインストールした場合は latest が入り、指定した場合はそのバージョンが入ります。

大きな違いとして、Extras 向けに $releasever(リリースバージョン) の下層で extras と切られています。

AL2 通常向けの詳細は次の記事を参照下さい。

Amazon Linux 2のyumリポジトリ構造を読み取る

また、通常のレポジトリは /etc/yum.repos.d/amzn2-core.repo で管理される一方で、Extras は /etc/yum.repos.d/amzn2-extras.repo で管理されています。

このファイルを実際に覗いてみましょう。

/etc/yum.repos.d/amzn2-extras.repo

### This file is managed with amazon-linux-extras. Please manage with that tool.
[amzn2extra-php7.2-source]
enabled = 0
name = Amazon Extras source repo for php7.2
mirrorlist = http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/php7.2/7.2.0/SRPMS/mirror.list
gpgcheck = 1

[amzn2extra-php7.2-debuginfo]
enabled = 0
name = Amazon Extras debuginfo repo for php7.2
mirrorlist = http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/php7.2/7.2.0/debuginfo/$basearch/mirror.list
gpgcheck = 1

[amzn2extra-php7.2]
enabled = 0
name = Amazon Extras repo for php7.2
mirrorlist = http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/php7.2/7.2.0/$basearch/mirror.list
gpgcheck = 1

※ 空行は適宜除去しています

トピック一覧はどうやって管理している?

amazon-linux-extras コマンドを実行するたびに最新のトピック一覧を取得しているようです。

最新トピックを取得する URL は http://amazonlinux.{awsregion}.{awsdomain}/{releasever}/extras-catalog.json という形をしており、リリースバージョン毎に異なることを想定しているようです。

RC で利用可能なリリースバージョン(2017.12)でフランクフルトリージョン(eu-central-1)から取得してみます。

$ curl http://amazonlinux.eu-central-1.amazonaws.com/2017.12/extras-catalog.json
{"motd": "", "status": "ok", "version": 1, "whitelists": [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]], "topics": [
        {"n": "ansible2", "inst": ["ansible"], "versions": ["2.4.2"]},
        {"n": "emacs", "inst": ["emacs"], "versions": ["25.3"]},
        {"n": "memcached1.5", "inst": ["memcached"], "versions": ["1.5.1"], "visible": ["memcached", "memcached-devel"]},
        {"n": "nginx1.12", "inst": ["nginx"], "versions": ["1.12.2"]},
        {"n": "postgresql9.6", "inst": ["postgresql"], "versions": ["9.6.6"]},
        {"n": "python3", "inst": ["python3", "python3-pip", "python3-setuptools", "python3-wheel"], "versions": ["3.6.2"]},
        {"n": "redis4.0", "inst": ["redis"], "versions": ["4.0.5"]},
        {"n": "R3.4", "inst": ["R"], "versions": ["3.4.3"]},
        {"n": "rust1", "inst": ["rust", "cargo"], "versions": ["1.22.1"]},
        {"n": "vim", "inst": ["vim-enhanced", "vim-minimal"], "versions": ["8.0"]},
        {"n": "golang1.9", "inst": ["golang"], "versions": ["1.9.2"]},
        {"n": "ruby2.4", "inst": ["ruby", "ruby-irb", "rubygem-rake", "rubygem-json", "rubygems"], "versions": ["2.4.2"]},
        {"n": "nano", "inst": ["nano"], "versions": ["2.9.1"]},
        {"n": "php7.2", "inst": ["php-cli", "php-pdo", "php-fpm", "php-json", "php-mysqlnd"], "versions": ["7.2.0"]},
        {"n": "lamp-mariadb10.2-php7.2", "inst": ["php-cli", "php-pdo", "php-fpm", "php-json", "php-mysqlnd", "mariadb"], "versions": ["10.2.10_7.2.0"]}
]}

トピックphp7.2を抜粋して、pretty print してみます。。

    {
      "n": "php7.2",
      "inst": [
        "php-cli",
        "php-pdo",
        "php-fpm",
        "php-json",
        "php-mysqlnd"
      ],
      "versions": [
        "7.2.0"
      ]
    },
  • n : トピック名
  • inst : YUM でインストールされるパッケージ
  • versions : トピックのバージョン

と推測されます。

amazon-linux-extras の実態

amazon-linux-extras は YUM と同じく Python2 で書かれており、 /usr/lib/python2.7/site-packages/amazon_linux_extras/cli.py にロジックのほぼ全てが詰まっています。

標準ライブラリだけで書かれており、コーディングスタイルもかなり保守的で、昔懐かし?の better shell 的な Python プログラムです。

まとめ

今回は Extras Library の使い方を紹介しました。

現時点では以下の2コマンドだけを覚えておけばOKです

  • $ amazon-linux-extras
  • $ sudo amazon-linux-extras install TOPIC-NAME

Extras Library のトピック管理はまだまだ荒削り感がありますが、専用のプログラムを用意しているので、時間の経過やトピックの種類・バージョンの充実により、より複雑な運用にも対応できるように、洗練されていくことを期待したいと思います。

後半はかなり趣味に走りましたが、現場からは以上です。

参考