こんにちは。千本木です。
EC2で使えるAmazon Linuxの新バージョンであるAmazon Linux 2 の正式版がリリースされて10ヶ月近く経過しました。
正式版と言えども稼働実績が少ないため、従来のAmazon Linuxからの移行を様子見している方も多いのではないでしょうか。
今回Amazon Linux 2を触ってみたところ便利な機能がありましたので、紹介したいと思います。
Amazon Linux 2の中身 
Amazon Linux 2を弄ってみると、systemdが採用されていたり、インストールされているパッケージバージョンからRHEL 7(CentOS 7)系をベースに開発されているようです。
例えばPHPのバージョンを確認するとCentOS 7の標準リポジトリと同じ5.4系が採用されていることがわかります。
# yum info php
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
Name        : php
Arch        : x86_64
Version     : 5.4.16
Release     : 45.amzn2.0.6
Size        : 1.4 M
Repo        : amzn2-core/2/x86_64
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
 
ですが、このPHP5.4系は既にPHP公式では開発はもちろんサポート自体も終了してしまっています。
2019年4月11日時点でサポートが終了しているPHPバージョンの一覧が以下のものです。
Unsupported Branches | php.nethttps://www.php.net/eol.php 
PHP7.0系までがサポート切れになっていることがわかります。
これはPHPに限ったことではなくPostgreSQLなども同様で、RHELベースのディストリビューションでは、開発元のサポートが終了しているバージョンを標準リポジトリで採用しているケースがあります。
十分に枯れているので安定的だと言えば確かにその通りですし、開発元のサポートが切れているとはいえ各ディストリビューションでの公式サポートは続きます。
ただ、セキュリティ面や機能面を考えると、これから構築して数年は動かそうというサーバでは、開発元のサポートが継続しているバージョンを使いたいですよね。
PHPに関して言えばremiリポジトリを使うという手段がありますが、既存パッケージと競合する場合もあり、ちょっと使い勝手が良くないです。
Software Collectionsを使うにしてもサポート期間が短いほか、インストールパスが通常と異なり癖があります。
tarballからインストールするなど他にも手段はありますが、もっと簡単にインストールができる仕組みはないものでしょうか。
Amazon Linux Extras 
そんなユーザーの要望に応える仕組みがAmazon Linux 2にありました。
AWSの公式サイトから引用すると Amazon Linux Extrasは以下のように説明されています。
簡単に言ってしまうと、Amazonが公式サポートした新バージョンをyumで扱えるようにする仕組みです。
amazon-linux-extrasのコマンド概要 
Amazon Linux Extrasを使うためにはamazon-linux-extrasコマンドを使用します。
helpコマンドで見てみると以下のようになります。
# 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.
 
大体以下の内容です。トピックというのはamazon-linux-extrasで取り扱いが可能なアプリケーションのことです。
amazon-linux-extras help :ヘルプの呼び出し(↑の状況)amazon-linux-extras info トピック名 :対象トピックの概要の表示amazon-linux-extras install トピック名 :対象トピックのインストールamazon-linux-extras list :トピック一覧の表示 
ちなみにアンインストール方法は公開されていません。この場合、yum removeで削除するしかないですね。
amazon-linux-extrasを使ってみよう 
listオプションを使ってトピック一覧を表示してみます。
# amazon-linux-extras list
  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  =1.31.0 ]
 11  vim                      available    [ =8.0 ]
 13  ruby2.4                  available    [ =2.4.2  =2.4.4 ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16 ]
 16  php7.1                   available    \
        [ =7.1.22  =7.1.25  =7.1.27 ]
 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  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16 ]
 18  libreoffice              available    [ =5.0.6.2_15  =5.3.6.1 ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =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  =8.5.38 ]
 24  epel                     available    [ =7.11 ]
 25  testing                  available    [ =1.0 ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    [ =1.8.0_192  =1.8.0_202 ]
 28  firecracker              available    [ =0.11 ]
 29  golang1.11               available    [ =1.11.3 ]
 30  squid4                   available    [ =4 ]
 31  php7.3                   available    [ =7.3.2  =7.3.3 ]
 32  lustre2.10               available    [ =2.10.5 ]
 33  java-openjdk11           available    [ =11 ]
 34  lynis                    available    [ =stable ]
 
多くのアプリケーションの様々なバージョンがありますね。
例えばPHPであれば、7.1 / 7.2 /7.3から選べます。
この他にも標準リポジトリではインストールできないnginxも選択できます。
LAMP環境を簡単に使えるlamp-mariadb10.2-php7.2なんていうトピックもあります。
PHP7.3のインストールテスト 
ではインストールしてみましょう。インストールは簡単で、以下のコマンドを実行します。
amazon-linux-extras install トピック名 
試しにPHP7.3をインストールしてみます。
# amazon-linux-extras install php7.3
Installing php-pdo, php-fpm, php-mysqlnd, php-cli, php-json
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-httpd_5f_modules amzn2extra-php7.3
13 metadata files removed
6 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                     | 2.4 kB  00:00:00
amzn2extra-docker                                                                                                              | 1.3 kB  00:00:00
amzn2extra-httpd_5f_modules                                                                                                    | 1.3 kB  00:00:00
amzn2extra-php7.3                                                                                                              | 1.3 kB  00:00:00
(1/6): amzn2-core/2/x86_64/group_gz                                                                                            | 2.4 kB  00:00:00
(2/6): amzn2-core/2/x86_64/updateinfo                                                                                          |  95 kB  00:00:00
(3/6): amzn2extra-docker/2/x86_64/primary_db                                                                                   |  51 kB  00:00:00
(4/6): amzn2extra-httpd_5f_modules/2/x86_64/primary_db                                                                         | 3.5 kB  00:00:00
(5/6): amzn2extra-php7.3/2/x86_64/primary_db                                                                                   |  74 kB  00:00:00
(6/6): amzn2-core/2/x86_64/primary_db                                                                                          |  28 MB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package php-cli.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
--> Processing Dependency: php-common(x86-64) = 7.3.3-1.amzn2.0.1 for package: php-cli-7.3.3-1.amzn2.0.1.x86_64
---> Package php-fpm.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
---> Package php-json.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
---> Package php-mysqlnd.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
---> Package php-pdo.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
--> Running transaction check
---> Package php-common.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================================================
 Package                           Arch                         Version                                 Repository                               Size
======================================================================================================================================================
Installing:
 php-cli                           x86_64                       7.3.3-1.amzn2.0.1                       amzn2extra-php7.3                       4.9 M
 php-fpm                           x86_64                       7.3.3-1.amzn2.0.1                       amzn2extra-php7.3                       1.7 M
 php-json                          x86_64                       7.3.3-1.amzn2.0.1                       amzn2extra-php7.3                        70 k
 php-mysqlnd                       x86_64                       7.3.3-1.amzn2.0.1                       amzn2extra-php7.3                       237 k
 php-pdo                           x86_64                       7.3.3-1.amzn2.0.1                       amzn2extra-php7.3                       132 k
Installing for dependencies:
 php-common                        x86_64                       7.3.3-1.amzn2.0.1                       amzn2extra-php7.3                       1.1 M
Transaction Summary
======================================================================================================================================================
Install  5 Packages (+1 Dependent package)
Total download size: 8.1 M
Installed size: 34 M
Is this ok [y/d/N]: y
Downloading packages:
(1/6): php-common-7.3.3-1.amzn2.0.1.x86_64.rpm                                                                                 | 1.1 MB  00:00:00
(2/6): php-cli-7.3.3-1.amzn2.0.1.x86_64.rpm                                                                                    | 4.9 MB  00:00:00
(3/6): php-fpm-7.3.3-1.amzn2.0.1.x86_64.rpm                                                                                    | 1.7 MB  00:00:00
(4/6): php-json-7.3.3-1.amzn2.0.1.x86_64.rpm                                                                                   |  70 kB  00:00:00
(5/6): php-pdo-7.3.3-1.amzn2.0.1.x86_64.rpm                                                                                    | 132 kB  00:00:00
(6/6): php-mysqlnd-7.3.3-1.amzn2.0.1.x86_64.rpm                                                                                | 237 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                  22 MB/s | 8.1 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : php-common-7.3.3-1.amzn2.0.1.x86_64                                                                                                1/6
  Installing : php-json-7.3.3-1.amzn2.0.1.x86_64                                                                                                  2/6
  Installing : php-pdo-7.3.3-1.amzn2.0.1.x86_64                                                                                                   3/6
  Installing : php-mysqlnd-7.3.3-1.amzn2.0.1.x86_64                                                                                               4/6
  Installing : php-cli-7.3.3-1.amzn2.0.1.x86_64                                                                                                   5/6
  Installing : php-fpm-7.3.3-1.amzn2.0.1.x86_64                                                                                                   6/6
  Verifying  : php-pdo-7.3.3-1.amzn2.0.1.x86_64                                                                                                   1/6
  Verifying  : php-cli-7.3.3-1.amzn2.0.1.x86_64                                                                                                   2/6
  Verifying  : php-fpm-7.3.3-1.amzn2.0.1.x86_64                                                                                                   3/6
  Verifying  : php-json-7.3.3-1.amzn2.0.1.x86_64                                                                                                  4/6
  Verifying  : php-mysqlnd-7.3.3-1.amzn2.0.1.x86_64                                                                                               5/6
  Verifying  : php-common-7.3.3-1.amzn2.0.1.x86_64                                                                                                6/6
Installed:
  php-cli.x86_64 0:7.3.3-1.amzn2.0.1  php-fpm.x86_64 0:7.3.3-1.amzn2.0.1  php-json.x86_64 0:7.3.3-1.amzn2.0.1  php-mysqlnd.x86_64 0:7.3.3-1.amzn2.0.1
  php-pdo.x86_64 0:7.3.3-1.amzn2.0.1
Dependency Installed:
  php-common.x86_64 0:7.3.3-1.amzn2.0.1
Complete!
  0  ansible2                 available    [ =2.4.2  =2.4.6 ]
  2  httpd_modules=latest     enabled      [ =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  =1.31.0 ]
 11  vim                      available    [ =8.0 ]
 13  ruby2.4                  available    [ =2.4.2  =2.4.4 ]
  _  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16 ]
  _  php7.1                   available    \
        [ =7.1.22  =7.1.25  =7.1.27 ]
  _  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  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16 ]
 18  libreoffice              available    [ =5.0.6.2_15  =5.3.6.1 ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =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  =8.5.38 ]
 24  epel                     available    [ =7.11 ]
 25  testing                  available    [ =1.0 ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    [ =1.8.0_192  =1.8.0_202 ]
 28  firecracker              available    [ =0.11 ]
 29  golang1.11               available    [ =1.11.3 ]
 30  squid4                   available    [ =4 ]
 31  php7.3=latest            enabled      [ =7.3.2  =7.3.3 ]
 32  lustre2.10               available    [ =2.10.5 ]
 33  java-openjdk11           available    [ =11 ]
 34  lynis                    available    [ =stable ]
 
あっという間にインストール完了です。
なお、この状態でphp-pgsqlをyumでインストールしようとすると以下のようになります。
# yum install php-pgsql
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package php-pgsql.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
--> Processing Dependency: libpq.so.5()(64bit) for package: php-pgsql-7.3.3-1.amzn2.0.1.x86_64
--> Running transaction check
---> Package postgresql-libs.x86_64 0:9.2.24-1.amzn2.0.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================================================
 Package                             Arch                       Version                                   Repository                             Size
======================================================================================================================================================
Installing:
 php-pgsql                           x86_64                     7.3.3-1.amzn2.0.1                         amzn2extra-php7.3                     130 k
Installing for dependencies:
 postgresql-libs                     x86_64                     9.2.24-1.amzn2.0.1                        amzn2-core                            235 k
Transaction Summary
======================================================================================================================================================
Install  1 Package (+1 Dependent package)
Total download size: 364 k
Installed size: 1.0 M
Is this ok [y/d/N]:
 
しっかりPHP7.3系で依存関係を解決してくれますね。
別バージョンのPostgreSQLをインストールした場合の依存関係 
ちなみにamazon-linux-extrasでPostgreSQL10をインストールした後で同様にphp-pgsqlをyumでインストールしてみても依存関係の問題は発生しません。
# amazon-linux-extras install postgresql10
略
# yum install php-pgsql
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Existing lock /var/run/yum.pid: another copy is running as pid 32534.
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory : 100 M RSS (317 MB VSZ)
    Started: Thu Apr 11 03:02:44 2019 - 00:04 ago
    State  : Running, pid: 32534
Resolving Dependencies
--> Running transaction check
---> Package php-pgsql.x86_64 0:7.3.3-1.amzn2.0.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================================================
 Package                         Arch                         Version                                   Repository                               Size
======================================================================================================================================================
Installing:
 php-pgsql                       x86_64                       7.3.3-1.amzn2.0.1                         amzn2extra-php7.3                       130 k
Transaction Summary
======================================================================================================================================================
Install  1 Package
Total download size: 130 k
Installed size: 361 k
Is this ok [y/d/N]:
 
手軽に確実に素早く新バージョンを使うことができます。素晴らしい!
まとめ 
インストールアプリケーションのバージョン選択は安定性を重視するのか、新機能やセキュリティを重視するのかで変わりますが、amazon-linux-extrasによって新バージョンも取り扱いが楽になりました。
サーバ管理者にとっては重大な脆弱性が発見された場合に、対応が早い最新版を選択し更新ができるこの仕組みは非常にありがたいのではないでしょうか。
amazon-linux-extrasだけでなく、今後Amazon Linux 2に搭載された新機能を発見したら紹介していきたいと思います。