Slide 1

Slide 1 text

Cloudformation(SAM)で実装したEC2の 運用自動化 @Saito5656 2022. 4. 29 JAWS-UG 浜松支部

Slide 2

Slide 2 text

自己紹介 @Saito 5656 情報技術者ではない?が JAWS-UG浜松に出没する 変なオヂサン なおネタはあまり需要がない アイコンは同居する🐈

Slide 3

Slide 3 text

今回のお題 user部門がEC2で検証してたアプリが本運用に CfnでdeployしたEC2を自動Backup自動更新 ⇒Lambdaで補助機能を作ってみた 検証用EC2を本運用向けに再構築

Slide 4

Slide 4 text

userアプリ検証用環境 Public subnet VPC AWS Cloud ap-northeast-3a Ap-northeast-3 Internet gateway Amazon CloudFront S3 Lambda@Edge Amazon SNS AmazonIpSpaceChanged ip-ranges.json RDP User Developer AWS Lambda http https WAF Sg-pub

Slide 5

Slide 5 text

本運用に向けて 要件定義 要望整理 ・自作アプリをInternet経由で見たい ・もしかすると社内のVMで運用する ・速やかに環境が欲しい 要求 非機能 機能 ・NW/serverには社内からInternet接続 ・データ保管場所も社内からInternet接続 ・当然ながら自動起動・自動停止 ・データは暗号化で、AD認証、社外からは接続不可 ・userがLatest版のアプリにアクセスできるように ・コスト重視だがBackupは欲しい

Slide 6

Slide 6 text

・自作アプリをInternet経由で見たい ・もしかすると社内のVMで運用する ・速やかに環境が欲しい 要求 非機能 機能 ・NW/serverには社内からInternet接続 ・データ保管場所も社内からInternet接続 ・当然ながら自動起動・自動停止 ・データは暗号化で、AD認証、社外からは接続不可 ・userがLatest版のアプリにアクセスできるように ・コスト重視だがBackupは欲しい ザクっとこんな構成でヨシ! このままEC2でGo🚀 社内と切離したほうがスピード対応可 DNSはRoute53でVPCとS3は継続利用 スケジュール実行すればイイか ALBでoidc→AD IdP、sgでIp縛り 開発serverのBackupを本番起動imageに CrossRegionCopyとる? ⇒ us-east-1

Slide 7

Slide 7 text

SAMで(buildと)deploy 項目多いしミスを避けたい deploy/destroyの手間も省きたい 非常時の立ち上げ操作は コマンド数行にして運用Grに任せたい CfnでIaC(合ってる?)化し目指すは完全放置

Slide 8

Slide 8 text

CfnだけでAMI更新後のId自動登録はムリ Azure IdP Public Public AWS Cloud VPC us-east-1a us-east-1c Auto Scaling group 本番用 us-east-1 (ASGはmax3台設定) 開発用 RDP https User 本番用 RDP/http Daily Backup ap-northeast-3 10.2.0.0/16 10.2.0.0/24 10.2.1.0/24 Sg-pub Sg-pri Sg-pri Sg-ALB https http https Developer ap-southeast-1 Daily Backup Copy Latest Backup AMI ap-northeast-1 http LaunchTemplate ASGで起動テンプレートがLatest設定できない 登録が必要 Copyが必要 初回起動に登録が必要

Slide 9

Slide 9 text

Id登録とversion設定をEvent実行で自動化 Public Public AWS Cloud VPC us-east-1a us-east-1c Auto Scaling group 本番用 us-east-1 (ASGはmax3台設定) 開発用 本番用 Update AMI Id Latest RDP/http CreateImage Daily Backup Set Version Latest CreateAutoScalingGroup ap-northeast-3 10.2.0.0/16 10.2.0.0/24 10.2.1.0/24 Sg-pub Sg-pri Sg-pri Sg-ALB https http ap-southeast-1 Daily Backup Copy Latest Backup AMI LaunchTemplate ap-northeast-1 AMI Id DevImage temporary AMI Id Copy Image Extract AMI Id http start stop LaunchTemplate ①ASGに起動テンプレートLatest設定 ②DLM起動後にAMI Id登録 ④AMI Id parameter出力 Azure IdP RDP https User https Developer ③AMI copy

Slide 10

Slide 10 text

①ASGの起動テンプレートのversion変更 Cfnでは数値でしか設定できない CreateASGで数値⇒Latestに書き換え BackupのLatestを登録したいので 数値で固定だと困る

Slide 11

Slide 11 text

①ASGの起動テンプレートのversion変更 ASGのCreateをtriggerにTemplate versionをupdate

Slide 12

Slide 12 text

②DLM実行後にAMI Id登録 DLM実行でcopyされたimageのAMI Idで 起動テンプレートをversion更新

Slide 13

Slide 13 text

②DLM起動後にAMI Id登録 CreateImageをtriggerに 新しいversionを作成

Slide 14

Slide 14 text

③AMIの手動copy (Backup立上げ時) 東京で障害が発生した場合 バージニアに同じtemplateをdeploy us-east-1 開発用 Copy Latest Backup AMI ap-northeast-1 AMI Id Dev Image Copy Image LaunchTemplate temporary AMI Id Extract AMI Id VPCとEC2をdeployする前に AMIのCrossRegionCopyから 起動用のImageを作成 templateのdeploy時に parameter storeからAMI Id読み込みアタッチ

Slide 15

Slide 15 text

③AMIの手動copy(Backup立上げ時) [‘image’][‘Name’]から日時最新版を抽出 CrossRegionCopyのtimestampは boto3.client.describe_imagesで直接拾えない

Slide 16

Slide 16 text

④AMI Idをparameter出力(Backup立上げ時) Backup先のtemplateに起動AMIのIdを渡す ためのparameter store出力 us-east-1 開発用 Copy Latest Backup AMI ap-northeast-1 AMI Id Dev Image Copy Image LaunchTemplate temporary AMI Id Extract AMI Id (時間切れで CreateImageのEventでLambda起動する 仕様になってない…後ほど変更予定)

Slide 17

Slide 17 text

④AMI Idをparameter出力(Backup立上げ時) 対象のAMI Idをparameter storeに出力 boto3.client.describe_imagesで [‘image’][‘Name’]に識別子を含むAMIを検出

Slide 18

Slide 18 text

まとめ (10行で立ち上げ可能にできた) 起動イメージの作成とAMI Idのparameter出力 $ aws lambda invoke --function-name Copy-Latest-Image-Function --region us-east-1 responce.json $ aws lambda invoke --function-name Export-Latest-AMIId-Function --region us-east-1 responce.json VPC、NW、ec2のdeploy $ cd .. $ cd project_root/EC2_Deploy $ sam deploy AutoScalingGroupのdeploy $ cd .././EC2_ASG_Deploy $ sam deploy 開発用EC2をオリジンとするCloudfrontのdeploy $ cd .././CloudFront_Deploy $ sam deploy 開発用EC2の自動起動・自動停止をするLambda関数のdeploy $ cd .././DevEC2-START-STOP-FUNC $ sam deploy

Slide 19

Slide 19 text

まとめ (関連記事) READMEが社内構築・復帰手順書がわり(Private)になったので お返しになりそうなところをまとめてQiitaに(初)投稿しました https://qiita.com/nsaito9628/items/62d82e534a34be2d5d37 https://qiita.com/nsaito9628/items/bcb17830d4f547816896 https://qiita.com/nsaito9628/items/1ed45fb2ac5ce4f6f54f

Slide 20

Slide 20 text

課題 かなり大きなtemplate.yamlになってしまった 今後は推奨に沿って入れ子で呼び出すような yaml作成を試したい

Slide 21

Slide 21 text

おまけ (ネ申コマンド) $ sam delete これ一発で全て消せるようになってた

Slide 22

Slide 22 text

ご清聴ありがとうございました