Skip to content

Amazon Linux 2 AMI起動手順書

概要

Amazon Linux 2 EOL対応として、取得したAMIから新しいインスタンスを起動する手順です。

対象インスタンス: 全15台

  • Terraform管理: 12台 → terraform applyで自動起動
  • Terraform管理外: 3台 → 手動起動

⚠️ 重要: 本手順の位置付け

本手順は緊急対応用です

この手順は、インスタンスが壊れたり起動しなくなった際に、AMIから緊急復旧するための手順です。

想定される緊急対応シナリオ:

  • Amazon Linux 2サポート切れ: EOL(2025年6月30日)後、公式AMIが利用できなくなり新規起動が不可能になるリスク
  • インスタンスのOS障害: OSの障害により起動不可
  • ハードウェア障害: AWSのハードウェア障害によるインスタンス停止
  • 誤操作: システムファイル破損、設定ミス等による起動不可
  • その他の緊急復旧: 上記以外で緊急復旧が必要な場合

📋 接続情報への影響(別途対応予定)

注意: AMIからインスタンスを起動した場合、以下の接続情報に影響が出る可能性があります:

  • SaaS連携: 外部SaaSサービス(Retool、Auth0等)の接続設定
  • デプロイ設定: CI/CDパイプラインの接続先設定
  • IPアドレス変更: プライベートIPが変わることによる影響
  • DNSレコード: Route53等のDNS設定
  • ロードバランサー: ALB/NLBのターゲットグループ設定

これらの影響の詳細な洗い出しと対応手順は、別途作成予定です。

緊急復旧時は、まずインスタンスを起動し、その後に接続情報の確認・修正を行ってください。

作成日: 2026-03-27 作成者: takahiro-oga


事前確認

1. Terraform管理状況

環境Terraform管理Terraform管理外合計
fd-dev4台2台6台
fd-prod4台0台4台
fd-sys4台1台5台
合計12台3台15台

Terraform管理外の2台:

  • i-0021f33ada7e21742: fd-system-dev-proxy-squid (fd-dev)
  • i-022a683b669777872: maintenance (fd-sys)

注釈: mental-retool-bation-stg (i-0d2816a7cd665c875) は削除予定のため対象外。

2. AMIに含まれるもの・含まれないもの

✅ AMIに含まれる

  • OS、ファイルシステム、インストール済みソフトウェア
  • EBSスナップショット

❌ AMIに含まれない(起動時に設定が必要)

  • タグ(Name, Environment等)
  • IAMロール(インスタンスプロファイル)
  • セキュリティグループ
  • サブネット/VPC
  • キーペア
  • インスタンスタイプ
  • Elastic IP
  • User Data

3. User Data調査結果

全15台でUser Dataなし(2026-03-27調査完了)

Terraformのbastion moduleには以下のUser Data定義がありますが、実際のインスタンスには設定されていません:

bash
#!/bin/bash
sed -i "s/retool-bastion-0/${ec2_name}/g" "/opt/aws/amazon-cloudwatch-agent/bin/config.json"
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

Terraform管理インスタンスの場合: terraform applyで自動的にUser Dataが適用されます。


Terraform管理インスタンス(12台)の起動手順

重要な注意事項

⚠️ インスタンスは削除→作成されます

  • ダウンタイムが発生する
  • インスタンスIDが変わる
  • プライベートIPが変わる可能性がある
  • タグ、IAMロール、SG、User Dataは自動設定される

AMI変数名

リージョン変数名
us-east-1 (Virginia)image_id
ap-northeast-1 (Tokyo)image_id_tokyo

手順

1. terraform.tfvarsをダウンロード

bash
# 環境ディレクトリに移動
cd fastdoctor-template/common/<環境>

# terraform.tfvarsをダウンロード
./download-tfvar.sh

2. AMI IDを変更

変更例:

hcl
# バージニアリージョンのインスタンス用
image_id = "ami-NEW_VIRGINIA_AMI_ID"

# 東京リージョンのインスタンス用
image_id_tokyo = "ami-NEW_TOKYO_AMI_ID"

3. terraform.tfvarsをS3にアップロード

bash
./upload-tfvar.sh

4. terraform planで確認

bash
terraform plan

確認ポイント:

  • Plan: 1 to add, 0 to change, 1 to destroy と表示される(正常)
  • AMI IDが ami-OLD_ID -> ami-NEW_ID に変更される
  • 意図しない他のリソースが変更されていないか確認

5. terraform applyで適用

bash
terraform apply

6. 動作確認

bash
# インスタンス状態確認
aws ec2 describe-instances \
  --region <REGION> \
  --profile <PROFILE> \
  --filters "Name=tag:Name,Values=<INSTANCE_NAME>" "Name=instance-state-name,Values=running" \
  --query 'Reservations[0].Instances[0].[InstanceId,State.Name,ImageId,PrivateIpAddress]' \
  --output table

# SSM接続確認
aws ssm start-session \
  --target <NEW_INSTANCE_ID> \
  --region <REGION> \
  --profile <PROFILE>

Terraform管理外インスタンス(3台)の起動手順

設定情報サマリー

i-0021f33ada7e21742: fd-system-dev-proxy-squid

項目
AWS Account900176301532
Regionap-northeast-1 (Tokyo)
Instance Typet3.small
Key Pairtamazaki-fd
VPCvpc-01522c0d0c0a8ddc8
Subnetsubnet-0cc6d929f60137959
IAM Rolefd-system-dev-proxy-squid
Security Groupfd-system-dev-squid (sg-01aaf87e5ebcaadb3)
EBS50GB, gp2, 暗号化なし
Elastic IP54.178.227.204 (eipalloc-06effa9614b1321ff) ⚠️ 要再アタッチ

i-022a683b669777872: maintenance

項目
AWS Account913831226605
Regionus-east-1 (Virginia)
Instance Typet2.medium
Key Pairec2-for-rds-maintenance
VPCvpc-fe806583
Subnetsubnet-ba75ecf7
IAM Roleなし
Security Groupdefault (sg-fa3c31df)
EBS8GB, gp2, 暗号化なし
Elastic IPなし

手動起動手順

1. fd-system-dev-proxy-squid(EIP付き)

重要: このインスタンスはElastic IP(54.178.227.204)が付与されています。以下の手順でIPアドレスを変えずにインスタンスを置き換えます。

Step 1: EIP Association IDの取得(事前確認)
bash
# 旧インスタンスのEIP関連付け情報を取得
aws ec2 describe-addresses \
  --allocation-ids eipalloc-06effa9614b1321ff \
  --region ap-northeast-1 \
  --profile <PROFILE> \
  --query 'Addresses[0].[AllocationId,PublicIp,InstanceId,AssociationId]' \
  --output table

確認: 出力されたAssociationId(例:assoc-XXXXX)を記録してください。次のステップで使用します。

Step 2: 新インスタンスの起動
bash
# インスタンス起動
NEW_INSTANCE=$(aws ec2 run-instances \
  --image-id <NEW_AMI_ID> \
  --instance-type t3.small \
  --key-name tamazaki-fd \
  --subnet-id subnet-0cc6d929f60137959 \
  --security-group-ids sg-01aaf87e5ebcaadb3 \
  --iam-instance-profile Name=fd-system-dev-proxy-squid \
  --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":50,"VolumeType":"gp2","Encrypted":false}}]' \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=fd-system-dev-proxy-squid}]' \
  --region ap-northeast-1 \
  --profile <PROFILE> \
  --query 'Instances[0].InstanceId' \
  --output text)

echo "新しいインスタンスID: $NEW_INSTANCE"
Step 3: 新インスタンス起動完了を待機
bash
aws ec2 wait instance-running \
  --instance-ids $NEW_INSTANCE \
  --region ap-northeast-1 \
  --profile <PROFILE>

echo "新インスタンス起動完了"
Step 4: 旧インスタンスからElastic IPを解除
bash
# Step 1で取得したAssociation IDを使用
aws ec2 disassociate-address \
  --association-id <ASSOCIATION_ID> \
  --region ap-northeast-1 \
  --profile <PROFILE>

echo "EIP解除完了"
Step 5: 新インスタンスにElastic IPを付与
bash
aws ec2 associate-address \
  --instance-id $NEW_INSTANCE \
  --allocation-id eipalloc-06effa9614b1321ff \
  --region ap-northeast-1 \
  --profile <PROFILE>

echo "EIP付与完了"

重要: 同じAllocation ID(eipalloc-06effa9614b1321ff)を使用するため、IPアドレス(54.178.227.204)は変わりません。外部からのアクセス設定(DNSレコード等)の変更は不要です。

Step 6: EIP付与の確認
bash
# Elastic IPアタッチ状態確認
aws ec2 describe-addresses \
  --allocation-ids eipalloc-06effa9614b1321ff \
  --region ap-northeast-1 \
  --profile <PROFILE> \
  --query 'Addresses[0].[AllocationId,PublicIp,InstanceId,AssociationId]' \
  --output table

確認ポイント:

  • PublicIp: 54.178.227.204(変更なし)
  • InstanceId: 新しいインスタンスID($NEW_INSTANCE
Step 7: 新インスタンスの検証

SSM接続確認、アプリケーション疎通確認を実施(詳細は「起動後の確認手順」セクション参照)

Step 8: 旧インスタンスの停止
bash
# 新インスタンスの動作確認がOKなら、旧インスタンスを停止
OLD_INSTANCE=<OLD_INSTANCE_ID>  # 旧インスタンスIDを設定

aws ec2 stop-instances \
  --instance-ids $OLD_INSTANCE \
  --region ap-northeast-1 \
  --profile <PROFILE>

echo "旧インスタンス停止完了: $OLD_INSTANCE"
Step 9: 旧インスタンスの削除(数日後)
bash
# 新インスタンスで数日〜1週間程度様子を見て、問題なければ旧インスタンスを削除
aws ec2 terminate-instances \
  --instance-ids $OLD_INSTANCE \
  --region ap-northeast-1 \
  --profile <PROFILE>

echo "旧インスタンス削除完了: $OLD_INSTANCE"

2. maintenance

重要: maintenanceインスタンスはSSM接続に必要なため、IAM Role付きで起動します。詳細な設定手順は「SSM接続設定」セクションを参照してください。

Step 1: インスタンス起動(IAM Role付き)
bash
# fd-sys環境の既存SSMインスタンスプロファイルを使用
INSTANCE_PROFILE_NAME="AmazonSSMRoleForInstancesQuickSetup"

# インスタンス起動(IAM Role付き)
NEW_INSTANCE=$(aws ec2 run-instances \
  --image-id <NEW_AMI_ID> \
  --instance-type t2.medium \
  --key-name ec2-for-rds-maintenance \
  --subnet-id subnet-ba75ecf7 \
  --security-group-ids sg-fa3c31df \
  --iam-instance-profile Name=${INSTANCE_PROFILE_NAME} \
  --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":8,"VolumeType":"gp2","Encrypted":false}}]' \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=maintenance}]' \
  --region us-east-1 \
  --profile <PROFILE> \
  --query 'Instances[0].InstanceId' \
  --output text)

echo "新しいインスタンスID: $NEW_INSTANCE"

# インスタンス起動完了を待機
aws ec2 wait instance-running \
  --instance-ids $NEW_INSTANCE \
  --region us-east-1 \
  --profile <PROFILE>

echo "インスタンス起動完了"
Step 2: SSMエージェント登録確認
bash
# SSMエージェントがオンラインになるまで5分程度待つ
echo "SSMエージェントの登録を待っています(5分程度)..."
sleep 300

# SSM Agent登録確認
aws ssm describe-instance-information \
  --filters "Key=InstanceIds,Values=$NEW_INSTANCE" \
  --region us-east-1 \
  --profile <PROFILE> \
  --query 'InstanceInformationList[0].[InstanceId,PingStatus,PlatformName]' \
  --output table

期待される結果: PingStatusOnline になっていること

注釈: SSM接続の詳細な確認方法やトラブルシューティングは「SSM接続設定」セクションを参照してください。

Step 3: 旧インスタンスの削除
bash
# 旧インスタンスID
OLD_INSTANCE="i-022a683b669777872"

# 旧インスタンス削除
aws ec2 terminate-instances \
  --instance-ids $OLD_INSTANCE \
  --region us-east-1 \
  --profile <PROFILE>

echo "旧インスタンス削除完了: $OLD_INSTANCE"

起動後の確認手順

1. インスタンス状態確認

bash
# インスタンスがrunning状態になるまで待機
aws ec2 wait instance-running \
  --instance-ids $NEW_INSTANCE \
  --region <REGION> \
  --profile <PROFILE>

# インスタンス詳細確認
aws ec2 describe-instances \
  --instance-ids $NEW_INSTANCE \
  --region <REGION> \
  --profile <PROFILE> \
  --query 'Reservations[0].Instances[0].[InstanceId,State.Name,ImageId,PrivateIpAddress,PublicIpAddress]' \
  --output table

2. Elastic IP確認(fd-system-dev-proxy-squidのみ)

bash
# Elastic IPアタッチ状態確認
aws ec2 describe-addresses \
  --allocation-ids eipalloc-06effa9614b1321ff \
  --region ap-northeast-1 \
  --profile fd-dev \
  --query 'Addresses[0].[AllocationId,InstanceId,PublicIp,AssociationId]' \
  --output table

3. アプリケーション疎通確認

各インスタンスの用途に応じて以下を確認:

  • fd-system-dev-proxy-squid: Squidプロキシサービス起動確認、プロキシ経由の疎通確認
  • maintenance: RDSメンテナンス用接続確認(SSM接続確認は起動手順のStep 2で完了済み)

SSM接続設定

maintenanceインスタンスなど、SSM接続が必要なインスタンスに対して、IAM RoleとInstance Profileを設定する手順です。

前提条件

  • AWS CLI設定済み
  • 適切なIAMポリシー権限(IAM Role/Instance Profile作成/確認権限)

既存のInstance Profileの確認

fd-sys環境では既にAmazonSSMRoleForInstancesQuickSetupが存在します。まずこちらを確認してください。

bash
# 既存のSSM用インスタンスプロファイルを確認
aws iam get-instance-profile \
  --instance-profile-name AmazonSSMRoleForInstancesQuickSetup \
  --profile <PROFILE>

# アタッチされているポリシーを確認
aws iam list-attached-role-policies \
  --role-name AmazonSSMRoleForInstancesQuickSetup \
  --profile <PROFILE>

期待される結果:

  • Instance Profile: AmazonSSMRoleForInstancesQuickSetup
  • アタッチされているポリシー: AmazonSSMManagedInstanceCore (必須)

既存のプロファイルが存在し、適切なポリシーがアタッチされている場合は、以下の新規作成手順は不要です。


IAM Role と Instance Profile の新規作成(既存がない場合のみ)

注意: fd-sys環境では既にAmazonSSMRoleForInstancesQuickSetupが存在するため、通常この手順は不要です。他の環境で必要な場合のみ実行してください。

Step 1: Trust Policy JSONファイル作成

bash
cat > /tmp/ec2-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

Step 2: IAM Role作成

bash
# IAM Roleを作成
aws iam create-role \
  --role-name SSMInstanceRole \
  --assume-role-policy-document file:///tmp/ec2-trust-policy.json \
  --description "IAM Role for EC2 instances to use SSM Session Manager" \
  --profile <PROFILE>

Step 3: SSM用ポリシーをアタッチ

bash
# AmazonSSMManagedInstanceCore ポリシーをアタッチ
aws iam attach-role-policy \
  --role-name SSMInstanceRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore \
  --profile <PROFILE>

Step 4: Instance Profile作成

bash
# Instance Profileを作成
aws iam create-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --profile <PROFILE>

# RoleをInstance Profileに追加
aws iam add-role-to-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --role-name SSMInstanceRole \
  --profile <PROFILE>

Step 5: 作成確認

bash
# Instance Profile確認
aws iam get-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --profile <PROFILE>

既存インスタンスへのIAM Role割り当て

起動済みインスタンスにIAM Roleを割り当てる場合:

bash
# fd-sys環境の既存プロファイルを使用
INSTANCE_PROFILE_NAME="AmazonSSMRoleForInstancesQuickSetup"

# Instance ProfileをEC2インスタンスに関連付け
aws ec2 associate-iam-instance-profile \
  --instance-id <INSTANCE_ID> \
  --iam-instance-profile Name=${INSTANCE_PROFILE_NAME} \
  --region <REGION> \
  --profile <PROFILE>

# 割り当て確認
aws ec2 describe-iam-instance-profile-associations \
  --filters "Name=instance-id,Values=<INSTANCE_ID>" \
  --region <REGION> \
  --profile <PROFILE>

SSM Agent登録確認

IAM Role割り当て後、SSM Agentがオンラインになるまで5分程度待ちます。

bash
# SSM Agent登録確認(数分かかる場合があります)
aws ssm describe-instance-information \
  --filters "Key=InstanceIds,Values=<INSTANCE_ID>" \
  --region <REGION> \
  --profile <PROFILE> \
  --query 'InstanceInformationList[0].[InstanceId,PingStatus,PlatformName,PlatformVersion]' \
  --output table

期待される結果:

  • PingStatus: Online になっていること

トラブルシューティング

問題1: terraform planで意図しない変更が表示される

bash
# Terraform stateをリフレッシュ
terraform refresh -var-file=terraform.tfvars

# 再度terraform planを実行
terraform plan -var-file=terraform.tfvars

問題2: SSM Agent が "Online" にならない

確認項目:

  • ネットワーク設定(インターネットゲートウェイ、VPCエンドポイント)
  • IAMロールに AmazonSSMManagedInstanceCore ポリシーがアタッチされているか
bash
# SSM Agent登録確認
aws ssm describe-instance-information \
  --filters "Key=InstanceIds,Values=<INSTANCE_ID>" \
  --region <REGION> \
  --profile <PROFILE>

問題3: Elastic IPが再アタッチできない

bash
# 元のインスタンスから解除されているか確認
aws ec2 describe-addresses \
  --allocation-ids <ALLOCATION_ID> \
  --region <REGION> \
  --profile <PROFILE>

# 必要に応じて先に解除
aws ec2 disassociate-address \
  --association-id <ASSOCIATION_ID> \
  --region <REGION> \
  --profile <PROFILE>

チェックリスト

Terraform管理インスタンス(12台)

fd-dev環境

  • [ ] バージニアリージョン(2台): bastion, bastion-retool
    • [ ] image_idを新AMI IDに更新
    • [ ] terraform plan/apply
    • [ ] 動作確認
  • [ ] 東京リージョン(2台): bastion-fd-sys, bastion-fd-sys-retool
    • [ ] image_id_tokyoを新AMI IDに更新
    • [ ] terraform plan/apply
    • [ ] 動作確認

fd-prod環境

  • [ ] バージニアリージョン(2台): bastion, bastion-retool
    • [ ] image_idを新AMI IDに更新
    • [ ] terraform plan/apply
    • [ ] 動作確認
  • [ ] 東京リージョン(2台): bastion-tokyo, bastion-fd-office
    • [ ] image_id_tokyoを新AMI IDに更新
    • [ ] terraform plan/apply
    • [ ] 動作確認

fd-sys環境

  • [ ] バージニアリージョン(2台): bastion, bastion-retool
    • [ ] image_idを新AMI IDに更新
    • [ ] terraform plan/apply
    • [ ] 動作確認
  • [ ] 東京リージョン(2台): bastion-fd-sys, bastion-fd-sys-retool
    • [ ] image_id_tokyoを新AMI IDに更新
    • [ ] terraform plan/apply
    • [ ] 動作確認

Terraform管理外インスタンス(2台)

  • [ ] i-0021f33ada7e21742: fd-system-dev-proxy-squid
    • [ ] 設定情報確認(/tmp/instance-config-backup/
    • [ ] AMIから手動起動
    • [ ] タグ設定
    • [ ] Elastic IP再アタッチ
    • [ ] 動作確認
  • [ ] i-022a683b669777872: maintenance
    • [ ] 設定情報確認
    • [ ] AMIから手動起動
    • [ ] タグ設定
    • [ ] 動作確認

関連ドキュメント


作成日: 2026-03-27 作成者: takahiro-oga 改訂履歴:

  • v2.0 (2026-03-27): Terraform管理状況、AMI内容、User Data調査結果を統合。シンプル・簡潔に再構成
  • v1.5 (2026-03-27): 背景セクションをAMI取得手順書への参照に変更
  • v1.0 (2026-03-26): 初版作成