AWS上でPHP7.4が動くEC2を作った

# 概要
AWS上でPHP7.1が動いているEC2を保有しています。
先日、PHP7.1のサポートがとっくに切れていることを知りまして、バージョンを上げなきゃなと思った次第です。
https://www.php.net/supported-versions.php

# 現在の管理
AWSはterraformで管理されていて、EC2内部はansibleで管理しています。

```yaml:main.yml
- name: Install PHP
  yum: name={{ item }} state=present enablerepo=epel
  with_items:
  - php71
  - php71-fpm
  - php71-mysqlnd
  - php71-mbstring
  - php71-gd
  - php71-bcmath
  - php71-devel
```

# 当初の発想
適当にphp71のところをphp74にすれば行けるかなと思ったのですが、そもそもepelにはPHP7.3までしか用意がないようでした。

```
$ yum list | grep php73.x86_64
php73.x86_64                         7.3.17-1.25.amzn1             amzn-updates 
$ yum list | grep php74.x86_64
$
```

PHP7.3でもいいかなとも思ったんですが、PHP7.3も結局今年中にはActive Supportが切れるようなのでPHP7.4にこだわることにしました。

# PHP7.4にする方法を考えた

ぐぐると、remiリポジトリを使う方法が結構出てくるのですが、AmazonはExtra Libraryを使う方法を公式で用意しているみたいです。
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#extras-library

remiリポジトリにはよくお世話になっていますが、remiリポジトリはRemi Colletさんが管理しているやつなので、今回はAmazon公式で採用している方法を取ることにします。
https://twitter.com/RemiCollet
（remiリポジトリには本当にお世話になっています。ありがとうございます。本人に届くことは無いと思いますが）

# amazon-linux-extrasを使えるようにする
では早速、公式ドキュメントどおりに `amazon-linux-extras list` を打って一覧を確認することにします。

```
$ amazon-linux-extras list
-bash: amazon-linux-extras: コマンドが見つかりません
```

なるほど。

ドキュメントに `(Amazon Linux 2)` と書いてあるということは、 `Amazon Linux 2` でしか使えないコマンドであるということですね。（某環境大臣風）

```
$ uname -a
Linux ip-10-0-1-144 4.14.171-105.231.amzn1.x86_64 #1 SMP Thu Feb 27 23:49:15 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

amzn1ってなってますね…

amiを管理しているterraformを書き換えます。

これを

```sh:aws_ami.tf
data "aws_ami" "amazon_linux" {
  ...
  filter {
    name   = "name"
    values = ["amzn-ami-hvm-*"]
  }
  ...
}
```

こんな感じ

```sh:aws_ami.tf
data "aws_ami" "amazon_linux" {
  ...
  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*"]
  }
  ...
}
```

terraform planを打つと、`forces new resource` と出て、EC2は作り直しになるようでした。
もしかすると私の環境だけかもしれないですが…
EC2なんてansibleとデプロイツールがあれば怖くないということで、バンバン作り直していくことにしました。（なおこの後本番環境に直で置いていた設定ファイルを保存していなかったことで大変後悔することになりますが、それは別の機会で…）

作り直した結果、amazon-linux-extrasコマンドが使えるようになりました。

```sh
$ amazon-linux-extras list | grep php7.4
 42  php7.4=latest            enabled      [ =stable ]
```

というわけで、ansibleも書き換えていきます。

```yaml:main.yml
- name: Enable PHP7.4
  shell: "amazon-linux-extras enable php7.4"
  changed_when: False
- name: Install PHP
  yum: name={{ item }} state=present enablerepo=amzn2extra-php7.4
  with_items:
  - php
  - php-fpm
  - php-mysqlnd
  - php-mbstring
  - php-gd
  - php-bcmath
  - php-devel
```

こんなwarningも出ちゃいましたが、調べたらとりあえず問題はなさそうだったので、先に進みます。次回の記事で解消します。

```
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying 
`name: "{{ item }}"`, please use `name: ['php', 'php-fpm', 'php-mysqlnd', 'php-mbstring', 'php-gd', 'php-bcmath', 'php-devel']` and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by setting deprecation_warnings=False in 
ansible.cfg.
```

# PHP7.4になった

こうして無事にPHP7.4になりました。

```
[ec2-user@ip-172-31-57-63 ~]$ php -v
PHP 7.4.5 (cli) (built: Apr 23 2020 00:10:21) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

# 今後

ここ数年、家庭の事情等であんまりアウトプットする機会もなかったんですが、今後は定期的に学んだことをアウトプットしていきます。