- 事前にオースケール元となるBase AMIのインスタンスを作成
- EC2のログインをSSM化してログインできるように
- SSM経由でAnsibleを実行できるように
- Nginx confやphp-fpm www.confなど適用できること
- Base Imageに対してAnsibleでパッケージ等インストール
- リリース時のデプロイスクリプト
- ソースコードをrsyncして転送できるように
- aws-cliでrunningしているインスタンスをtag名で取ってくるように
- GitHub Actions
- ssmのインストール
- デプロイシェルスクリプトをhookして実行
- Masterマージ
- オートスケール(Terraform化)
- AMI化をしておく(Base AMI)
- ユーザーデータ
- リポジトリをgit pull
- AMIでCPU30%以上になったらインスタンスをMax 6台に
- CPU10%以下でインスタンス2台
- abコマンドで負荷テスト
- インスタンス台数が増えていることを確認
- Base AMIを更新する場合
- Auto Scaling グループから手動で最新のAMIを指定してローリングアップデートができていること
- autoscale.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
resource "aws_launch_configuration" "api" { name_prefix = "api" image_id = var.ami_autoscale_api instance_type = "t2.micro" key_name = "hoge" security_groups = [aws_security_group.api.id] iam_instance_profile = aws_iam_instance_profile.ssm_role.name associate_public_ip_address = true user_data = <<-EOF #! /bin/bash cd /var/www/hoge sudo -u hoge-dev git checkout . sudo -u hoge-dev git pull sudo -u hoge-dev /usr/local/bin/composer install sudo -u hoge-dev php artisan config:clear sudo -u hoge-dev php artisan view:clear sudo -u hoge-dev php artisan migrate --force sudo hostnamectl set-hostname api EOF lifecycle { create_before_destroy = true #初回のみで起動設定を更新する際手動で行うためignore ignore_changes = [ root_block_device ] } root_block_device { delete_on_termination = true encrypted = false volume_size = "50" volume_type = "gp2" } } resource "aws_autoscaling_group" "api" { name = "api" max_size = 2 min_size = 1 desired_capacity = 1 health_check_grace_period = 300 health_check_type = "ELB" force_delete = true launch_configuration = aws_launch_configuration.api.id vpc_zone_identifier = [aws_subnet.hoge-app-1a.id, aws_subnet.hoge-app-1c.id] target_group_arns = [aws_lb_target_group.hoge-api.arn] tag { key = "deploy" value = "app" propagate_at_launch = true } tag { key = "Name" value = "hoge-api-scale" propagate_at_launch = true } lifecycle { create_before_destroy = true ignore_changes = [ launch_configuration ] } } resource "aws_autoscaling_policy" "api_scale_out" { name = "Instance-ScaleOut-CPU-High" scaling_adjustment = 1 adjustment_type = "ChangeInCapacity" cooldown = 300 autoscaling_group_name = aws_autoscaling_group.api.name } resource "aws_autoscaling_policy" "api_scale_in" { name = "Instance-ScaleIn-CPU-Low" scaling_adjustment = -1 adjustment_type = "ChangeInCapacity" cooldown = 300 autoscaling_group_name = aws_autoscaling_group.api.name } resource "aws_cloudwatch_metric_alarm" "api_high" { alarm_name = "api-CPU-Utilization-High-30" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = "1" metric_name = "CPUUtilization" namespace = "AWS/EC2" period = "300" statistic = "Average" threshold = "30" dimensions = { AutoScalingGroupName = aws_autoscaling_group.api.name } alarm_actions = [aws_autoscaling_policy.api_scale_out.arn] } resource "aws_cloudwatch_metric_alarm" "api_low" { alarm_name = "api-CPU-Utilization-Low-10" comparison_operator = "LessThanThreshold" evaluation_periods = "1" metric_name = "CPUUtilization" namespace = "AWS/EC2" period = "300" statistic = "Average" threshold = "10" dimensions = { AutoScalingGroupName = aws_autoscaling_group.api.name } alarm_actions = [aws_autoscaling_policy.api_scale_in.arn] } |
Base AMI(Golden Image)の運用方法
- base-amiを起動する
- Ansibleで適用/または手動で設定ファイルなどを変更
- git pullをしてソースは最新に
- フロントをbuildしておく
- base-amiを停止する
- AMIを取得する
- 起動設定からアクション > base-amiの起動テンプレートからbase-ami_xxxxxxxxxx > アクションからテンプレート変更(新しいバージョンを作成)
- 自分のAMIから先程取得したAMIを指定し、テンプレートのバージョンを選択し保存
- Auto Scaling グループ > base-ami > インスタンスの更新(90/300に指定して)からローリングアップデート(約10分待つ)
Was this helpful?
0 / 0
1989年生まれのFindy/SRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWSでのインフラ構築、Docker開発環境の提供、IaC、新技術の検証、リファクタリング、セキュリティ強化、分析基盤の運用などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTA/TechBullで未経験者にインフラのコーチング/コミュニティマネージャーとして立ち上げと運営をしている。また、過去「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。