terraformでec2を作成するときに常に最新のAMIを利用するようにしてみる

## 概要
terraformでAL2を作成しようとするとAMI-IDを指定する必要があるが、
いちいち最新を調べて修正するのが面倒なので、常に最新版を持ってくるようにしたい。
(どこかを参考にしたような気がするが資材が残っていたので資材を削除する前に文章化しました。多分以下とやってることは同じだったと思います)

https://qiita.com/to-fmak/items/7623ee6e15249a4bcedd

https://dev.classmethod.jp/articles/launch-ec2-from-latest-amazon-linux2-ami-by-terraform/

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

# AMI-IDを調べる
公式の記事にあるような手順でどのようなAMIがあるか取得します。

https://aws.amazon.com/jp/blogs/news/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/

ただ、このままだとRegionを指定しろとエラーがでるのでとりあえず東京Regionを入れています。
またamazonlinux2のhvmだけでいいので`Values=amzn2-ami-hvm`にしています。
```bash
aws ec2 describe-images --region ap-northeast-1 --owners amazon --filters "Name=name,Values=amzn2-ami-hvm*" --query 'sort_by(Images, &CreationDate)[].Name'
```
そうすると以下のようにAMIを取得できます。
```bash
    "amzn2-ami-hvm-2.0.20211001.1-arm64-gp2",
    "amzn2-ami-hvm-2.0.20211001.1-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20211001.1-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20211005.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20211005.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20211005.0-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20211103.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20211103.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20211103.0-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20211201.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20211201.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20211201.0-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20211223.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20211223.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20211223.0-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20220121.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20220121.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20220121.0-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20220207.1-arm64-gp2",
    "amzn2-ami-hvm-2.0.20220207.1-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20220207.1-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20220218.1-arm64-gp2",
    "amzn2-ami-hvm-2.0.20220218.1-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20220218.1-x86_64-gp2",
………
    "amzn2-ami-hvm-2.0.20230822.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20230822.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20230822.0-x86_64-gp2",
    "amzn2-ami-hvm-2.0.20230906.0-arm64-gp2",
    "amzn2-ami-hvm-2.0.20230906.0-x86_64-ebs",
    "amzn2-ami-hvm-2.0.20230906.0-x86_64-gp2"
```
この記事作成時点の最新AMIは`amzn2-ami-hvm-2.0.20230906`のようですね。


# terraformを作成
自分のローカルにあった部分から参考記事でいいなと思った以下を追記しました。
また、EIPを付与するようにしています。
- `lifecycle`オプションを付けることでAMI IDの変更による再作成を避けたる

```terraform
# ec2 with Publick address
resource "aws_instance" "sample_web_server" {
  ami                    = data.aws_ami.amazon-linux-2.id # Amazon Linux 2
  instance_type          = "t3.nano"
  subnet_id              = "subnet-xxxx" # public subnet
  vpc_security_group_ids = ["xxxx"]
  key_name               = "ec2_key_pair"

  lifecycle {
    ignore_changes = [
      ami,
    ]
  }
}

resource "aws_eip" "ec2" {
  instance = aws_instance.sample_web_server.id
  vpc      = true
}

// Amazon Linuxの最新AMI
data "aws_ami" "amazon-linux-2" {
  most_recent = true #最新版を指定
  owners      = ["amazon"]
  filter {
    name   = "owner-alias"
    values = ["amazon"]
  }
  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}
```

appyします。
ちゃんと最新のAMIで作成されてますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/e22ec53b-725c-3f1a-42a5-88d7bb84caef.png)


# ハマったところとか
- 特になし