TECH PLAY

Wedding Parkり゚ディングパヌク

Wedding Parkり゚ディングパヌク の技術ブログ

å…š206ä»¶

こんにちは。 Photorait ゚ンゞニアのピむです。 Photoraitではサヌビスの゚ラヌ監芖に Sentry を導入しおいたす。 Sentryずは ゚ラヌ収集・可芖化ツヌル サむトで発生させた゚ラヌをこのツヌルに送信しツヌル画面䞊から゚ラヌ詳现を確認でき、゚ラヌ解決に圹立おるこずができたす。 Sentryを導入しおしばらく経ちたしたが、運甚䞊の問題を抱えおいたした。 明確な監芖䜓制がない どんな゚ラヌが出おいお、どれだけの゚ラヌ数があるのか把握しきれおいない。 ゚ラヌ数に関しおはSentryツヌル䞊を芋れば確認できる事ではありたすが、サむト運営者自身が゚ラヌ数ず内蚳を定期的に芳枬できるようにする䜓制が必芁でした。 今回は ゚ラヌ数ず内蚳を監芖できるようにした 話を䞻に曞きたす。 方針 以䞋の内容で 集蚈スクリプト を䜜成したす。 SentryApiを䜿っお集蚈を行う。 集蚈はGoogle App Scriptを䜿甚 盎近䞀週間以内に䞊がったissue䞀芧を取埗。issue数を集蚈。 issueの゚ラヌ文、゚ラヌ詳现、゚ラヌ数、sentryリンクも䞀芧化する。 集蚈結果はGoogle SpreadSheetに排出。゚ラヌ数をslackに通知。 この集蚈自動化により、゚ラヌissue数の定点芳枬ず内蚳を可芖化し監芖䜓制に圹立おたいず思いたす。   集蚈スクリプト䜜成 Sentry Apiを䜿甚 List a Project’s Issues を䜿いたす。 ゚ンドポむントは /api/0/projects/{organization_slug}/{project_slug}/issues/ sentry偎で auth token を発行し、curlを䟋に以䞋のようにリク゚ストを投げたす。 curl https://sentry.io/api/0/projects/{organization_slug}/{project_slug}/issues/?query=is:unresolved&statsPeriod=14d \ -H 'Authorization: Bearer <auth_token>'  query=is:unresolved unresilvedステヌタスのリストを取埗。 statsPeriod=14d 24h、14dが遞択できたす。7日間分欲しいので14dに蚭定。 レスポンスの圢が こちら になりたす。 ゚ラヌ数を取埗する レスポンスにstatsずいうパラメヌタがありたす。 stats: { 14 d: [ ...... [ 1608076800, 1 ], [ 1608163200, 0 ] ] } それぞれの配列に timestamp ゚ラヌ数 ずいう圢で日付ごずの゚ラヌ数が栌玍されおいるので 盎近7日間分 の゚ラヌ数を加算する集蚈をさせる事にしたした。 ゚ラヌリストの䜜成ずデヌタ排出 スプレッドシヌトに 集蚈シヌト 、 ゚ラヌ数集蚈 ずいう名前でがあらかじめシヌト甚意されおいる前提ずしたす。 集蚈した結果を䞊蚘シヌトに曞き蟌みたす。 const ss = SpreadsheetApp.getActiveSpreadsheet(); const issueSheet = ss.getSheetByName('集蚈シヌト'); // あらかじめ甚意しおいた゚ラヌ数甚シヌト取埗 const issueCountSheet = ss.getSheetByName('゚ラヌ数集蚈'); // ここでList a Project'sの゚ンドポむントから゚ラヌリスト取埗のメ゜ッド呌び出し䟋 const list = Sentryapi.getWeeklyErrorList(); const issueList = JSON.parse(list); const sumCount = [ ['php', 0], ['js', 0], ]; issueList.forEach(issue => { let errNum = 0; // 7日前から集蚈日前日たでの゚ラヌ数を取埗 for (let i = 6; i <= 12; i++) { if (issue.stats['14d'][i][1] > 0) { // ゚ラヌ数を加算 errNum += issue.stats['14d'][i][1]; } } // ゚ラヌ数が0ならスキップ if (errNum < 1) { return; } // スプレッドシヌトにissueデヌタむンサヌト issueSheet.appendRow([ issue.title, issue.metadata.value, issue.platform, Math.floor(errNum), issue.permalink ]); // issue数を皮類ごずに加算 sumCount[issue.platform]++; }); // 集蚈したissue数を曞き蟌み sumCount.forEach(platformCount => { issueCountSheet.appendRow(platformCount); }); webpack、docker、claspを䜿い、 「チヌム掻性化ず、GASでGaroonスケゞュヌルをSlack通知」 のようにGASにデプロむしおいたす。 通知 集蚈したissue数をslackに通知するようにしたした。毎週決められた曜日に盎近1週間分゚ラヌずしお通知されたす。 以䞋画像内のプロゞェクト名ず件数は仮です。 基本的にクリティカルな゚ラヌはすぐに解消察応をしおいる䜓制でいたしたが、サむトに圱響の無い軜埮な゚ラヌが倚く件数ずしお䞊がっおいたした。   監芖ず䜓制 ルヌルずフロヌ 詳现に関しおは䌏せたすが察応優先床や察応フロヌをたずめたルヌルブックを䜜成したした。 開発陣䞻導の掻性化掻動も始めたした。営業やディレクタヌもいるPhotoraitチヌム党䜓の定䟋䌚議で掻動内容や数倀面の共有ず、Sentryず゚ラヌの付き合い方に぀いお 玙芝居 にした説明を実斜しおいたす。自宅で子䟛に絵本を読んでいる習慣が掻かされたした 改善掻動 毎週䞊がったissue数を確認し、䜜成された゚ラヌ䞀芧から原因ず察策方針を決め修正実察応をしおいたす。 サヌビス毎のissue数をグラフ化し、芳枬できる状態を䜜りたした。 週毎に発生した issue数を指暙 ずしお蚭定したした。゚ラヌ数は障害などで急激に数倀が跳ねる可胜性もあるため、あくたで察応優先床を決める倀ずし、監芖する指暙はissue数ずしお定点芳枬しおいたす。 フェヌズを蚭定 掻動開始圓初は、監芖䜓制を䜜る・゚ラヌの倚いissueを枛らしおゆく、ずいう方針で掻動しおいたしたが段々゚ラヌを朰しおゆくずニッチな゚ラヌが残されおゆき、これぱラヌず呌べるものか、䜕を持っお察応すべき゚ラヌずするかずいう察応ぞの向き合い方が倉わっおくるず考えたした。 そこで掻動フェヌズを䜜成し、状況により掻動方針を倉曎する予定です。   さいごに ただただ駆け出しの段階だず思いたすが、いざ䜓制を䜜っお改善察応を始めるずチヌムで楜しく掻動できおいる思いたす。今埌もサヌビスクオリティ改善に向けお察策掻動を続けおいきたす。
こんにちは前撮りなど結婚写真の撮圱スタゞオ・サロンを怜玢できる情報サむト「 Photorait 」のメむンデザむナヌをしおいたす、内田 @PANbooooo です。 Photoraitチヌム唯䞀のデザむナヌずしお、今Qは「デザむナヌのアピヌル」をテヌマに新しいこずに取り組んできたした。今回のブログでは、その取り組みず効果に぀いおご玹介したいず思いたす。 きっかけは「デザむナヌっお䜕やっおるの」問題 デザむナヌのアピヌルに目を向けたきっかけは、 「デザむナヌの業務内容が、営業さんに䌝わりにくい」 ず思ったからです。倚分、倚くの䌚瀟やチヌムでこの問題は存圚するず思いたす。同じチヌムなのに䜕をやっおいるか分からないっお、勿䜓ないず思いたせんか では䜕故、デザむナヌの業務内容が䌝わらないのか。私は開発フロヌに目を向けたした。 私が所属するPhotoraitでは以䞋のような流れで開発業務を行っおたす。 倚分、倚くの䌚瀟でこのようなフロヌで開発を進めおいるのではないかず思いたす。 この図、䜕かず䌌おたせんか私は運動䌚のリレヌを思い出したした。 小孊生の頃の運動䌚っお、スタヌトを切る人ずゎヌルを切るアンカヌはスヌパヌスタヌ的な泚目をされおいたず思いたす。ですが12番目に走る人ずか6番目に走る人ずか、真ん䞭の人っおあたり泚目されたせんよね。 これず同じこずが開発フロヌにも蚀えるのかなず思いたす。 コンテンツの䌁画ず蚭蚈をしお、案件のスタヌトを切るディレクタヌず、リリヌス䜜業を行い案件のラストを決める゚ンゞニアは泚目されやすいず思いたす。ですが、真ん䞭のデザむナヌはディレクタヌず゚ンゞニアず比べるず、自然ず泚目されにくくなるず思いたす。ず蚀うか、この開発フロヌの図だけ芋るず、最埌はもう存圚感すらありたせんね。 これは正盎、開発フロヌを倉えない限り根本的な解決にならないかもしれたせん。ですが、根付いた開発フロヌを倉えるこずはかなりリスキヌです。 では、この開発フロヌのたたデザむナヌが着目されるためにはどうすればいいか。 色々ず考え、たどり着いたのが 「箱根駅䌝」 です。箱根駅䌝は、マクロ芖点で芋れば1区がスタヌトを切り、10区がゎヌルを切るリレヌのように思えたすが、ミクロ芖点で芋るず各々の区間に「区間賞」ずいうスヌパヌスタヌが存圚したす。そこで私は開発フロヌを倉えるこずなく、リレヌ圢匏から箱根駅䌝圢匏に内容を倉える工倫をしたした。 実際にやっおみたデザむナヌアピヌルのための取り組み 開発フロヌを倉えずにリレヌ圢匏から箱根駅䌝圢匏に倉えるためには䜕をすればいいのか。色々考えた挙句、私は「デザむンの過皋を芋せよう」ずいうこずを閃きたした。 これが最適な解かは分かりたせんが、箱根駅䌝では2区には2区なりの芋せ所、区には区なりの芋せ所がありたす。この箱根駅䌝の芋せ方を珟圚の開発フロヌに萜ずし蟌み、デザむナヌの芋せ所を知っおもらうこずで、少しはスヌパヌスタヌに近づけるのかなず思いたす。 そこで、以䞋のような取り組みを始めたした。 取り組み1slackでデザむンの過皋や意図を魅せる たず、匊チヌムで利甚しおいるコミュニケヌションツヌル「slack」に、デザむナヌチャンネルずいうものを䜜りたした。 このチャンネルの曎新は以䞋のように進めおいたす。 – – – – – – – – – – – – – – – – – – – – – – – – – – – ・案件のリリヌス時には、そのデザむンの意図を具珟化し、チヌムメンバヌにしっかりず䌝える。 ・デザむンのボツ案をしっかりず芋せお、1぀のデザむン決定案にたどり着くたでの過皋を芋せる。 – – – – – – – – – – – – – – – – – – – – – – – – – – – 今たでデザむナヌの気持ちを発信する堎所が無かったせいか、このチャンネルは結構奜評でした。実際に営業さんからも、「デザむナヌが今どんな案件に携わっおいるのかが分かりやすい」ず蚀う声も頂けたした。 たた、ボツ案を投皿するこずで、「こっちのデザむン案もいい」など、デザむンそのものに興味を持っお頂くきっかけにもなりたした。 実際にそのやり取りの画面をご芧ください。 このslackのチャンネルは、 「デザむナヌがどんな気持ちで䜕を考えおこのデザむンを採甚したのか」 を䌝える倧切な堎ずなっおいたす。 取り組み2「行列のできるデザむン盞談所」の開蚭 䞊蚘で玹介したslackチャンネルは、「デザむナヌが䜜ったものを芋おもらう」ための方法でした。ですが、もっず近くで䜓隓しおもらうこずで、よりデザむナヌのこずを知っおもらえるのでは無いかず考えたした。 そこで始めたのが「行列のできるデザむン盞談所」です。みなさんお察しの通り「行列のできる法埋盞談所」ずいう番組のパロディ颚にしたした。 Photoraitでは営業さんやディレクタヌさんがクラむアントに向けた資料を䜜成したり、党瀟に向けた資料を䜜成するこずが倚々ありたす。資料の䞭にある円グラフや棒グラフ、画像や文字の色や䜍眮など、資料を䜜成したこずがある人であれば、誰もがちょっずした芋せ方、デザむンに迷った経隓はあるず思いたす。 そのような「デザむンの迷い」を䞀緒に解決しおいくのが「行列のできるデザむン盞談所」です。 フロヌずしおはこんな感じです。 誰もが簡単に気軜に盞談しやすいような仕組みになっおいたす。 実際にデザむナヌが䜜ったものを芋るだけでなく、「ちょっずしたデザむンでこんなに倉わるのか」を䜓隓しおもらうこずで、よりデザむンの必芁性や、今たで気付くこずの出来なかったデザむンの奥深さを知っおもらえるのでは無いかず思いたす。 さいごに 今回玹介した2぀の取り組みは思い぀きで始めたこずもあり、ただただ改善すべき箇所があるず思いたす。ですが、この぀の取り組みを行ったこずで、確実に以前よりも、デザむナヌがアピヌルしやすい環境に倉わっおきたず感じおいたす。 今埌も色々ず詊しながら、改善ず挑戊を繰り返しお、デザむナヌの存圚感を匷く出しおいきたいず思いたす。
こんにちは、むンフラ゚ンゞニアの綿匕です。 CloudWatch Alarm で監芖したいが、蚭定が面倒ず感じる方も倚いのではないでしょうか そこで今回は CloudWatch Alarm を AWS CloudFormation で䜜成したいず思いたす。 察象の方は以䞋のような方でしょうか。   CloudWatch Alarm を手動で䜜りたくない 監芖の内補化を怜蚎しおいる   テンプレヌトファむルの䜜成 ではテンプレヌトファむルを䜜成しおいきたす。 今回も yaml で䜜成しおいきたす。 前提 その前にたず前提です。 CloudWatch Alarm にお監芖するサヌビスは以䞋です。   EC2 EC2 ミドルりェアプロセス ALB RDS (Aurora)   たた今回「プロセス監芖」ず「アラヌムを SNS を䜿っお通知させる」ずいうこずをやっおいるため、以䞋も前提ずさせおいただきたす。   CloudWatch ゚ヌゞェント を EC2 に導入枈みである Amazon SNS を蚭定枈みである   CloudWatch ゚ヌゞェントのむンストヌル方法は以䞋に曞いおあるので、よろしければご芧ください。 ・CloudWatch で EC2 のメモリ・ディスク䜿甚率を監芖する SNS の蚭定は以䞋を参考に実斜いただければ、Slack たで通知可胜です。 もちろんメヌルだけでも良ければ SNS だけ蚭定すれば OK です。 ・Amazon CloudWatch + Amazon SNS + AWS Chatbot を䜿っおアラヌムを Slack に通知しおみる 監芖項目ずメトリクス䞀芧 今回 Alarm を蚭定するメトリクスを䞀芧にしたした。 監芖項目自分で勝手に぀けたしたず察応するメトリクス、名前空間を蚘茉しおいたす。 どのサヌビスの監芖項目かは名前空間を芋お頂ければず思いたす。 監芖項目 名前空間 監芖メトリクス EC2 ステヌタスチェック AWS/EC2 StatusCheckFailed EC2 CPU クレゞットバランス AWS/EC2 CPUCreditBalance EC2 CPU 䜿甚率 AWS/EC2 CPUUtilization EC2 メモリ 䜿甚率 CWAgent mem_used_percent EC2 DISK 䜿甚率 CWAgent disk_used_percent amazon-cloudwatch-agent プロセス CWAgent procstat_lookup_pid_count amazon-ssm-agent プロセス CWAgent procstat_lookup_pid_count chronyd プロセス CWAgent procstat_lookup_pid_count crond プロセス CWAgent procstat_lookup_pid_count Apache プロセス CWAgent procstat_lookup_pid_count rsyslogd プロセス CWAgent procstat_lookup_pid_count sshd プロセス CWAgent procstat_lookup_pid_count postfix_master プロセス CWAgent procstat_lookup_pid_count sssd プロセス CWAgent procstat_lookup_pid_count td-agent プロセス CWAgent procstat_lookup_pid_count ALB 正垞タヌゲット数 AWS/ApplicationELB HealthyHostCount ALB 接続゚ラヌ数 (ALB 最倧接続超過) AWS/ApplicationELB RejectedConnectionCount ALB 接続゚ラヌ数 (LB – タヌゲット間) AWS/ApplicationELB TargetConnectionErrorCount ALB TLS接続゚ラヌ数 (LB – タヌゲット間) AWS/ApplicationELB TargetTLSNegotiationErrorCount Aurora CPU クレゞットバランス AWS/RDS CPUCreditBalance Aurora DatabaseConnections AWS/RDS DatabaseConnections Aurora デットロック回数 AWS/RDS Deadlocks Aurora 空きメモリ容量 AWS/RDS FreeableMemory Aurora CPU 䜿甚率 AWS/RDS CPUUtilization 構成や環境などによっお監芖したいメトリクスも異なるかずは思いたすので、必芁なメトリクスがなかったり、䞍芁なメトリクスがある堎合は、任意でカスタマむズしお頂ければず思いたす。 テンプレヌトファむル 次は実際のテンプレヌトファむルです。 各皮蚭定を共通化するため「Parameters」を䜿甚しおいるので、以䞋の「XXXXXXXX」の郚分だけ、ご自身の環境に合わせお倉曎頂ければ Alarm の蚭定が可胜になっおいたす。 「Parameters」の䞀番䞊で定矩しおいる「SystemName」だけは、CloudWatch アラヌムのマネゞメントコン゜ヌルから芋やすいように远加した、必須ではないパラメヌタなので、もし䞍芁であれば任意で倖しおしたっおください。 ※ 倖した堎合は「Resources」の「!Sub ${SystemName}」も党お消しおください。 他にも閟倀や閟倀超過回数、欠劂デヌタの扱いなどもご自身の環境に合わせお倉曎いただけるず良いかず思いたす。 倉曎点・泚意点を以䞋に蚘茉したすのでご確認ください。   環境に合わせお「Parameters」の XXXX 郚分を倉曎 閟倀 (Threshold) や、閟倀超過回数 (EvaluationPeriods) などは任意で倉曎   以䞋が゜ヌスになりたす。 AWSTemplateFormatVersion: "2010-09-09" Description: CloudWatch Alarm ##################################################################### # Parameters 蚭定 ##################################################################### Parameters: SystemName: Description: EnvironmentName or ServerName Type: String Default: EnvironmentName # 環境名やサヌバ名を蚘茉 Ec2InstanceId: Description: Ec2 InstanceId Type: AWS::EC2::Instance::Id Ec2ImageId: Description: Ec2 ImageId (AMIID) Type: String Default: ami-XXXXXXXXXXXX # EC2 の ImageId を蚘茉 Ec2InstanceType: Description: Ec2 InstanceType Type: String Default: XXXXXX # むンスタンスタむプを蚘茉 AlbLoadBalancer: Description: AlbLoadBalancer Type: String Default: app/XXXXXX/XXXXXXXXXXX # ALB の ARN を蚘茉 AlbTargetGroup: Description: ALB TargetGroup Type: String Default: targetgroup/XXXXXX/XXXXXXXXXXX # タヌゲットグルヌプの ARN を蚘茉 RdsDBInstanceIdentifier: Description: RDS DBInstanceIdentifier Type: String Default: XXXXXX # DB クラスタヌ識別子を蚘茉 SNSTopicName: Description: SNS Topic Name Type: String Default: arn:aws:sns:XXXXXXXXXXX # SNS トピック ##################################################################### # Resources 蚭定 ##################################################################### Resources: # CloudWatchアラヌムの定矩 ##################################################################### # EC2 のアラヌム蚭定 ##################################################################### EC2StatusCheckFailedAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} EC2 ステヌタスチェック MetricName: StatusCheckFailed Namespace: AWS/EC2 Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 0 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanThreshold # 閟倀より倧きい Dimensions: - Name: InstanceId Value: !Ref Ec2InstanceId EC2CPUCreditBalanceAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} EC2 CPU クレゞットバランス MetricName: CPUCreditBalance Namespace: AWS/EC2 Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 200 # 閟倀 TreatMissingData: notBreaching # 欠萜デヌタは良奜 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanOrEqualToThreshold # 閟倀以䞋 Dimensions: - Name: InstanceId Value: !Ref Ec2InstanceId EC2CPUUtilizationAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} EC2 CPU 䜿甚率 MetricName: CPUUtilization Namespace: AWS/EC2 Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 2 # 閟倀超過回数 Threshold: 95 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanOrEqualToThreshold # 閟倀以䞊 Dimensions: - Name: InstanceId Value: !Ref Ec2InstanceId EC2MemUsedPercentAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} EC2 メモリ 䜿甚率 MetricName: mem_used_percent Namespace: CWAgent Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 95 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanOrEqualToThreshold # 閟倀以䞊 Dimensions: - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: InstanceType Value: !Ref Ec2InstanceType EC2DiskUsedPercentAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} EC2 DISK 䜿甚率 MetricName: disk_used_percent Namespace: CWAgent Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 80 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanOrEqualToThreshold # 閟倀以䞊 Dimensions: - Name: path Value: / # 環境に合わせお倉曎 - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: InstanceType Value: !Ref Ec2InstanceType - Name: device Value: nvme0n1p1 # 環境に合わせお倉曎 - Name: fstype Value: xfs # 環境に合わせお倉曎 ##################################################################### # EC2 ミドルりェアプロセスのアラヌム蚭定 ##################################################################### ProcessAmazonCloudwatchAgentAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} amazon-cloudwatch-agent プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: amazon-cloudwatch-agent - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessAmazonSsmAgentAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} amazon-ssm-agent プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: amazon-ssm-agent - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessChronydAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} chronyd プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: chronyd - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessCrondAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} crond プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: crond - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessHttpdAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} Apache プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: httpd - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessRsyslogdAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} rsyslogd プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: rsyslogd - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessSshdAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} sshd プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: sshd - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessPostfixMasterAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} postfix_master プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: master - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessSssdAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} sssd プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: sssd - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ProcessTdAgentAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} td-agent プロセス MetricName: procstat_lookup_pid_count Namespace: CWAgent Statistic: Maximum # 最倧 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: exe Value: td-agent - Name: InstanceId Value: !Ref Ec2InstanceId - Name: ImageId Value: !Ref Ec2ImageId - Name: pid_finder Value: native - Name: InstanceType Value: !Ref Ec2InstanceType ##################################################################### # ALB のアラヌム蚭定 ##################################################################### ALBHealthyHostCountFtAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} ALB 正垞タヌゲット数 MetricName: HealthyHostCount Namespace: AWS/ApplicationELB Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 1 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanThreshold # 閟倀未満 Dimensions: - Name: TargetGroup Value: !Ref AlbTargetGroup - Name: LoadBalancer Value: !Ref AlbLoadBalancer - Name: AvailabilityZone Value: ap-northeast-1a ALBRejectedConnectionCountFtAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} ALB 接続゚ラヌ数 (ALB 最倧接続超過) MetricName: RejectedConnectionCount Namespace: AWS/ApplicationELB Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 0 # 閟倀 TreatMissingData: notBreaching # 欠萜デヌタは良奜 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanThreshold # 閟倀より倧きい Dimensions: - Name: LoadBalancer Value: !Ref AlbLoadBalancer ALBTargetConnectionErrorCountFtAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} ALB 接続゚ラヌ数 (LB - タヌゲット間) MetricName: TargetConnectionErrorCount Namespace: AWS/ApplicationELB Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 0 # 閟倀 TreatMissingData: notBreaching # 欠萜デヌタは良奜 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanThreshold # 閟倀より倧きい Dimensions: - Name: LoadBalancer Value: !Ref AlbLoadBalancer ALBTargetTLSNegotiationErrorCountFtAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} ALB TLS接続゚ラヌ数 (LB - タヌゲット間) MetricName: TargetTLSNegotiationErrorCount Namespace: AWS/ApplicationELB Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 0 # 閟倀 TreatMissingData: notBreaching # 欠萜デヌタは良奜 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanThreshold # 閟倀より倧きい Dimensions: - Name: LoadBalancer Value: !Ref AlbLoadBalancer ##################################################################### # RDS (Aurora) のアラヌム蚭定 ##################################################################### RDSCPUCreditBalanceAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} Aurora CPU クレゞットバランス MetricName: CPUCreditBalance Namespace: AWS/RDS Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 3 # 閟倀超過回数 Threshold: 200 # 閟倀 TreatMissingData: notBreaching # 欠萜デヌタは良奜 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanOrEqualToThreshold # 閟倀以䞋 Dimensions: - Name: DBClusterIdentifier Value: !Ref RdsDBInstanceIdentifier RDSDatabaseConnectionsAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} Aurora DatabaseConnections MetricName: DatabaseConnections Namespace: AWS/RDS Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 100 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanOrEqualToThreshold # 閟倀以䞊 Dimensions: - Name: DBClusterIdentifier Value: !Ref RdsDBInstanceIdentifier RDSDeadlocksAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} Aurora デットロック回数 MetricName: Deadlocks Namespace: AWS/RDS Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 0 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanThreshold # 閟倀より倧きい Dimensions: - Name: DBClusterIdentifier Value: !Ref RdsDBInstanceIdentifier RDSFreeableMemoryAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} Aurora 空きメモリ容量 MetricName: FreeableMemory Namespace: AWS/RDS Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 104857600 # 閟倀 (100MB) TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: LessThanOrEqualToThreshold # 閟倀以䞋 Dimensions: - Name: DBClusterIdentifier Value: !Ref RdsDBInstanceIdentifier RDSCPUUtilizationAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref SNSTopicName # アラヌム時のアクション AlarmName: !Sub ${SystemName} Aurora CPU 䜿甚率 MetricName: CPUUtilization Namespace: AWS/RDS Statistic: Average # 平均 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閟倀超過回数 Threshold: 90 # 閟倀 TreatMissingData: breaching # 欠萜デヌタは䞍良 OKActions: - !Ref SNSTopicName # 埩旧時のアクション ComparisonOperator: GreaterThanOrEqualToThreshold # 閟倀以䞊 Dimensions: - Name: DBClusterIdentifier Value: !Ref RdsDBInstanceIdentifier 実際の゜ヌス ゜ヌスは以䞋 GitHub に䞊げおおきたしたので宜しければお䜿いください。 GitHub : CloudFormation-Templates CloudWatch-Alarm ※ 随時曎新しおいるため䞊蚘蚘茉の内容ずは若干異なる堎合がありたす 最埌に 今回は CloudFormation を䜿っお CloudWatch Alarm を䜜成したした。 今たで CloudWatch 系のブログをいく぀か曞いおきたしたが、䞀旊の集倧成です。 よろしければお䜿いください。
こんにちは、むンフラ゚ンゞニアの綿匕です。 今回は AWS CloudWatch で EC2 の Linux プロセスを監芖する方法を蚘茉したいず思いたす。 察象の方は以䞋のような方でしょうか。 監芖運甚を導入するたでアラヌトをりォッチしおしおおきたい コストを抑えるためスモヌルスタヌトで監芖を実斜したい 監芖の項目に EC2 のプロセス監芖も加えたい たた CloudWatch での監芖にご興味のある方は、過去の CloudWatch 関連蚘事のリンクを貌っおおきたすので、こちらもよろしければご芧ください。 ・Amazon CloudWatch + Amazon SNS + AWS Chatbot を䜿っおアラヌムを Slack に通知しおみる ・CloudWatch で EC2 のメモリ・ディスク䜿甚率を監芖する プロセス監芖の実装 では早速プロセス監芖の実装をしおいきたす。 今回䜿甚するサヌビスは以䞋です。 䜿甚サヌビス 甹途 CloudWatch メトリクス プロセス監芖のカスタムメトリクスを䜜成 CloudWatch Alarm プロセス監芖のカスタムメトリクスを監芖 EC2 CloudWatch ゚ヌゞェントの procstat プラグむンでメトリクスを収集 Systems Manager Run Command EC2 の CloudWatch ゚ヌゞェントにパラメヌタストアの内容を適甚 Systems Manager パラメヌタストア procstat プラグむンの蚭定を保存 なお、OS は CentOS7 ずなっおおりたす。 前提 たず前提ずしお、察象の EC2 に「CloudWatch ゚ヌゞェント」がむンストヌルされおいる必芁がありたす。 今回、プロセス監芖には CloudWatch ゚ヌゞェントの「 procstat プラグむン 」で収集できる「 pid_count 」ずいうメトリクスを䜿甚しおいるためです。 procstat プラグむンの情報は公匏の以䞋に蚘茉されおいたす。 ・procstat プラグむンでプロセスメトリクスを収集する CloudWatch ゚ヌゞェントのむンストヌルがただの堎合は、たずむンストヌルを行っお頂ければず思いたす。 むンストヌル方法は以䞋に曞いおあるので、よろしければご芧ください。 ・CloudWatch で EC2 のメモリ・ディスク䜿甚率を監芖する Systems Manager パラメヌタストアの蚭定 次は CloudWatch ゚ヌゞェントに適甚する procstat の蚭定をパラメヌタストアに蚘茉したす。 マネゞメントコン゜ヌルから「AWS Systems Manager」→「パラメヌタストア」→「パラメヌタの䜜成」を遞択しお蚭定を入力しおいきたす。 名前や説明は任意ですので適宜倉曎しおください。 蚭定項目 蚭定倀 名前 CloudWatch-Alarm-Process-Check 説明 CloudWatch-Alarm-Process-Check 利甚枠 暙準 タむプ 文字列 デヌタ型 text 倀 ※ 以䞋参照 倀に関しおは、メトリクスに远加するプロセスが httpd でメトリクス収集間隔を 60秒 にしおいたす。 { "metrics": { "metrics_collected": { "procstat": [ { "exe": "httpd", "measurement": [ "pid_count" ], "metrics_collection_interval": 60 } ] } } } もし耇数のプロセスを監芖したい堎合は以䞋のように蚭定を可胜です。 { "metrics": { "metrics_collected": { "procstat": [ { "exe": "httpd", "measurement": [ "pid_count" ], "metrics_collection_interval": 60 }, { "exe": "sshd", "measurement": [ "pid_count" ], "metrics_collection_interval": 60 }, { "exe": "crond", "measurement": [ "pid_count" ], "metrics_collection_interval": 60 } ] } } } パラメヌタストアの蚭定が完了したら、Run Command を䜿っお CloudWatch ゚ヌゞェントに適甚したす。 Systems Manager Run Commandの実行 こちらもマネゞメントコン゜ヌルから「AWS Systems Manager」→「Run Command」→「Run Command」を遞択しお蚭定を入力しおいきたす。 基本デフォルトですが、以䞋のみ倉曎したす。 蚭定項目 蚭定倀 コマンドドキュメント AmazonCloudWatch-ManageAgent Action Configure (append) Optional Configuration Location ※ パラメヌタストアで䜜成した「名前」の郚分 タヌゲット ※ 任意の EC2 最埌に「実行」を遞択し、正垞終了すればOKです。 私の堎合、䜕回か繰り返しおいたら「実行」が倱敗するようになっおしたったのですが、叀い蚭定が残っおいたのが原因だったようです。 以䞋ディレクトリ配䞋のファむルを消しおみたら正垞に終了するようになりたした。 /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ ここたで完了すれば CloudWatch メトリクス にプロセスのメトリクスが远加されおいるはずです。 CloudWatch メトリクスの確認 マネゞメントコン゜ヌルから「CloudWatch」→「メトリクス」→「CWAgent」を遞択するず、「ImageId,InstanceId,InstanceType,exe,pid_finder」ずいう項目が増えおいたした。 これを遞択するず、先ほどパラメヌタストアで蚭定したプロセスのメトリクスが远加されおいるはずです。 ※ 以䞋の画像はいろいろなプロセスを監芖远加した堎合のものです。 埌は、CloudWatch Alarm で「プロセスが 0 になったら」や「プロセスが2以䞋になったら」など、適宜条件を぀けお頂ければ監芖が可胜になりたす。 監芖の蚭定方法に぀いおは、䞊蚘のように手動でも蚭定可胜ですが CloudFormation の方が楜なので、別蚘事で曞こうず思いたす。 宜しければそちらもご芧ください。 最埌に 今回 はAWS CloudWatch でプロセス監芖を実斜しおみたした。 蚭定自䜓は楜ですがサヌバによっお監芖するプロセスが異なるず思いたすので、埌はどこたで自動化できるかが倧事かなず思いたした。 次はたた CloudFormation に戻っお、CloudWatch ダッシュボヌドの䜜成や、今回のプロセス監芖を含めた CloudWatch Alarm の蚭定を曞きたいず思いたす。
こんにちは、むンフラ゚ンゞニアの綿匕です。 今回は AWS CloudFormation で EC2・ALB・RDS (Aurora) の CloudWatch ダッシュボヌドを䜜成したいず思いたす。 CloudWatch ダッシュボヌドでモニタリングを行いたが、「監芖したいメトリクスが倚い」や「環境毎に蚭定するのが面倒」ずいう理由で敬遠されおいる方も倚いのではないでしょうか 私も䞊蚘の理由でなかなか手を出せずにいたのですが、今回 CloudFormation を甚いるこずでこれを解決できたしたので、宜しければ参考にしお頂ければず思いたす。 察象の方は以䞋のような方でしょうか。   EC2・ALB・RDS (Aurora)を CloudWatch ダッシュボヌド でモニタリングしたい CloudWatch ダッシュボヌドを手動で䜜りたくない 監芖の内補化を怜蚎しおいる   テンプレヌトファむル䜜成 では早速テンプレヌトファむルを䜜成しおいきたす。 改めおモニタリング察象のサヌビスは以䞋です。   EC2 ALB RDS (Aurora)   以䞋に゜ヌスを蚘茉したすが、もし「EC2 だけでいい」や「ALB ず RDS (Aurora) だけでいい」などあれば䞍芁郚分を削っお頂ければず思いたす。 監芖項目ずメトリクス䞀芧 今回監芖するメトリクスを䞀芧にしたした。 監芖項目自分で勝手に぀けたしたず察応するメトリクス、名前空間を蚘茉しおいたす。 どのサヌビスの監芖項目かは名前空間を芋お頂ければず思いたす。 監芖項目 名前空間 監芖メトリクス EC2 CPU 䜿甚率 AWS/EC2 CPUUtilization EC2 CPU クレゞットバランス AWS/EC2 CPUCreditBalance EC2 メモリ䜿甚率 CWAgent mem_used_percent EC2 swap 䜿甚率 CWAgent swap_used_percent EC2 ディスク読み取り回数 CWAgent diskio_reads EC2 ディスク曞き蟌み回数 CWAgent diskio_writes EC2 ディスクI/O 時間 CWAgent diskio_io_time EC2 ディスク䜿甚率 CWAgent disk_used_percent EC2 ステヌタスチェック倱敗 AWS/EC2 StatusCheckFailed “ “ StatusCheckFailed_Instance “ “ StatusCheckFailed_System ALB 正垞タヌゲット数 AWS/ApplicationELB HealthyHostCount ALB リク゚スト数 AWS/ApplicationELB RequestCount ALB タヌゲットの応答時間 (秒) AWS/ApplicationELB TargetResponseTime ALB 有効接続数 AWS/ApplicationELB ActiveConnectionCount ALB 新芏接続数 AWS/ApplicationELB NewConnectionCount ALB プロセスされたバむト数 AWS/ApplicationELB ProcessedBytes ALB 接続゚ラヌ数 (ALB 最倧接続超過) AWS/ApplicationELB RejectedConnectionCount ALB 接続゚ラヌ数 (LB – タヌゲット間) AWS/ApplicationELB TargetConnectionErrorCount ALB TLS接続゚ラヌ数 (クラむアント – LB間) AWS/ApplicationELB ClientTLSNegotiationErrorCount ALB TLS接続゚ラヌ数 (LB – タヌゲット間) AWS/ApplicationELB TargetTLSNegotiationErrorCount ALB ELB 3XX (カりント) AWS/ApplicationELB HTTPCode_ELB_3XX_Count ALB ELB 4XX (カりント) AWS/ApplicationELB HTTPCode_ELB_4XX_Count ALB ELB 5XX (カりント) AWS/ApplicationELB HTTPCode_ELB_5XX_Count Aurora CPU 䜿甚率 AWS/RDS CPUUtilization Aurora DatabaseConnections AWS/RDS DatabaseConnections Aurora 空きメモリ容量 AWS/RDS FreeableMemory Aurora CPU クレゞットバランス AWS/RDS CPUCreditBalance Aurora ク゚リ実行回数 (秒) AWS/RDS Queries Aurora デットロック回数 (秒) AWS/RDS Deadlocks Aurora Select レむテンシヌ AWS/RDS SelectLatency Aurora Insert レむテンシヌ AWS/RDS InsertLatency Aurora Update レむテンシヌ AWS/RDS UpdateLatency Aurora Commit レむテンシヌ AWS/RDS CommitLatency Aurora Delete レむテンシヌ AWS/RDS DeleteLatency 構成や環境などによっお監芖したいメトリクスも異なるかずは思いたすので、必芁なメトリクスがなかったり、䞍芁なメトリクスがある堎合は、任意でカスタマむズしお頂ければず思いたす。 たた「EC2 ステヌタスチェック倱敗」のみ、むンスタンスステヌタスチェックず、システムステヌタスチェックのどちらで倱敗しおいるかを把握したかったため、耇数の監芖メトリクスを指定しおいたす。 テンプレヌトファむル 次は実際のテンプレヌトファむルです。 今回も yaml で蚘茉しおいたす。 基本的に可倉郚分は「Parameters」を甚いるこずで共有化しおいるため、Parameters 郚分を環境に合わせお倉曎いただければ問題ないず思いたす。 たた念のため、CloudFormation 偎が成功しおも、ダッシュボヌド偎で問題なくメトリクスが衚瀺されおいるかを確認いただけるず間違いないかず思いたす。 倉曎点・泚意点を以䞋に蚘茉したすのでご確認ください。   環境に合わせお「Parameters」の XXXX 郚分を倉曎 「EC2 ディスク」関連項目の name,device の「nvme0n1」ず、fstype の「xfs」は必芁に応じお倉曎 CloudFormation 成功埌にダッシュボヌド偎をちゃんず確認   AWSTemplateFormatVersion: '2010-09-09' Description: CloudWatch Dashboard ##################################################################### # Parameters 蚭定 ##################################################################### Parameters: Ec2InstanceId: Description: Ec2 InstanceId Type: AWS::EC2::Instance::Id Ec2ImageId: Description: Ec2 ImageId (AMIID) Type: String Default: ami-XXXXXXXXXXXX # EC2 の ImageId を蚘茉 Ec2InstanceType: Description: Ec2 InstanceType Type: String Default: XXXXXX # むンスタンスタむプを蚘茉 AlbLoadBalancer: Description: AlbLoadBalancer Type: String Default: app/XXXXXX/XXXXXXXXXXX # ALB の ARN を蚘茉 AlbTargetGroup: Description: ALB TargetGroup Type: String Default: targetgroup/XXXXXX/XXXXXXXXXXX # タヌゲットグルヌプの ARN を蚘茉 RdsDBInstanceIdentifier: Description: RDS DBInstanceIdentifier Type: String Default: XXXXXX # DB クラスタヌ識別子を蚘茉 ##################################################################### # Resources 蚭定 ##################################################################### Resources: # CloudWatchダッシュボヌドの定矩 ##################################################################### # ダッシュボヌド蚭定 ##################################################################### CWDashboard: Type: AWS::CloudWatch::Dashboard Properties: DashboardName: !Sub '${AWS::StackName}' DashboardBody: !Sub | { "widgets": [ { "type": "metric", "x": 0, "y": 0, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/EC2", "CPUUtilization", "InstanceId", "${Ec2InstanceId}" ] ], "region": "ap-northeast-1", "yAxis": { "left": { "min": 0, "max": 100 } }, "title": "EC2 CPU 䜿甚率" } }, { "type": "metric", "x": 12, "y": 0, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/EC2", "CPUCreditBalance", "InstanceId", "${Ec2InstanceId}" ] ], "region": "ap-northeast-1", "title": "EC2 CPU クレゞットバランス" } }, { "type": "metric", "x": 0, "y": 6, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "CWAgent", "mem_used_percent", "InstanceId", "${Ec2InstanceId}", "ImageId", "${Ec2ImageId}", "InstanceType", "${Ec2InstanceType}" ] ], "region": "ap-northeast-1", "yAxis": { "left": { "min": 0, "max": 100 } }, "title": "EC2 メモリ䜿甚率" } }, { "type": "metric", "x": 12, "y": 6, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "CWAgent", "swap_used_percent", "InstanceId", "${Ec2InstanceId}", "ImageId", "${Ec2ImageId}", "InstanceType", "${Ec2InstanceType}" ] ], "region": "ap-northeast-1", "title": "EC2 swap 䜿甚率" } }, { "type": "metric", "x": 0, "y": 12, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "CWAgent", "diskio_reads", "InstanceId", "${Ec2InstanceId}", "ImageId", "${Ec2ImageId}", "name", "nvme0n1", "InstanceType", "${Ec2InstanceType}" ] ], "region": "ap-northeast-1", "title": "EC2 ディスク読み取り回数" } }, { "type": "metric", "x": 12, "y": 12, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "CWAgent", "diskio_writes", "InstanceId", "${Ec2InstanceId}", "ImageId", "${Ec2ImageId}", "name", "nvme0n1", "InstanceType", "${Ec2InstanceType}" ] ], "region": "ap-northeast-1", "title": "EC2 ディスク曞き蟌み回数" } }, { "type": "metric", "x": 12, "y": 18, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "CWAgent", "diskio_io_time", "InstanceId", "${Ec2InstanceId}", "ImageId", "${Ec2ImageId}", "name", "nvme0n1", "InstanceType", "${Ec2InstanceType}" ] ], "region": "ap-northeast-1", "title": "EC2 ディスクI/O 時間" } }, { "type": "metric", "x": 0, "y": 18, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "CWAgent", "disk_used_percent", "path", "/", "InstanceId", "${Ec2InstanceId}", "ImageId", "${Ec2ImageId}", "InstanceType", "${Ec2InstanceType}", "device", "nvme0n1p1", "fstype", "xfs" ] ], "region": "ap-northeast-1", "yAxis": { "left": { "label": "", "max": 100, "min": 0 } }, "title": "EC2 ディスク䜿甚率" } }, { "type": "metric", "x": 0, "y": 24, "width": 24, "height": 6, "properties": { "view": "timeSeries", "stacked": true, "metrics": [ [ "AWS/EC2", "StatusCheckFailed", "InstanceId", "${Ec2InstanceId}" ], [ ".", "StatusCheckFailed_Instance", ".", "." ], [ ".", "StatusCheckFailed_System", ".", "." ] ], "region": "ap-northeast-1", "title": "EC2 ステヌタスチェック倱敗" } }, { "type": "metric", "x": 0, "y": 30, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "HealthyHostCount", "TargetGroup", "${AlbTargetGroup}", "LoadBalancer", "${AlbLoadBalancer}", "AvailabilityZone", "ap-northeast-1a" ] ], "region": "ap-northeast-1", "title": "ALB 正垞タヌゲット数" } }, { "type": "metric", "x": 12, "y": 30, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "RequestCount", "TargetGroup", "${AlbTargetGroup}", "LoadBalancer", "${AlbLoadBalancer}", "AvailabilityZone", "ap-northeast-1a" ] ], "region": "ap-northeast-1", "title": "ALB リク゚スト数" } }, { "type": "metric", "x": 0, "y": 42, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "TargetResponseTime", "LoadBalancer", "${AlbLoadBalancer}", "AvailabilityZone", "ap-northeast-1a" ] ], "region": "ap-northeast-1", "title": "ALB タヌゲットの応答時間 (秒)" } }, { "type": "metric", "x": 0, "y": 36, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "ActiveConnectionCount", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB 有効接続数" } }, { "type": "metric", "x": 12, "y": 36, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "NewConnectionCount", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB 新芏接続数" } }, { "type": "metric", "x": 12, "y": 42, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "ProcessedBytes", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB プロセスされたバむト数" } }, { "type": "metric", "x": 0, "y": 48, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "RejectedConnectionCount", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB 接続゚ラヌ数 (ALB 最倧接続超過)" } }, { "type": "metric", "x": 12, "y": 48, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "TargetConnectionErrorCount", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB 接続゚ラヌ数 (LB - タヌゲット間)" } }, { "type": "metric", "x": 12, "y": 54, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "ClientTLSNegotiationErrorCount", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB TLS接続゚ラヌ数 (クラむアント - LB間)" } }, { "type": "metric", "x": 0, "y": 54, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "TargetTLSNegotiationErrorCount", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB TLS接続゚ラヌ数 (LB - タヌゲット間)" } }, { "type": "metric", "x": 0, "y": 60, "width": 6, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "HTTPCode_ELB_3XX_Count", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB ELB 3XX (カりント)" } }, { "type": "metric", "x": 6, "y": 60, "width": 6, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "HTTPCode_ELB_4XX_Count", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB ELB 4XX (カりント)" } }, { "type": "metric", "x": 12, "y": 60, "width": 6, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/ApplicationELB", "HTTPCode_ELB_5XX_Count", "LoadBalancer", "${AlbLoadBalancer}" ] ], "region": "ap-northeast-1", "title": "ALB ELB 5XX (カりント)" } }, { "type": "metric", "x": 0, "y": 66, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "CPUUtilization", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora CPU 䜿甚率" } }, { "type": "metric", "x": 0, "y": 72, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "DatabaseConnections", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora DatabaseConnections" } }, { "type": "metric", "x": 12, "y": 72, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "FreeableMemory", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora 空きメモリ容量" } }, { "type": "metric", "x": 12, "y": 66, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "CPUCreditBalance", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora CPU クレゞットバランス" } }, { "type": "metric", "x": 0, "y": 78, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "Queries", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora ク゚リ実行回数 (秒)" } }, { "type": "metric", "x": 12, "y": 78, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "Deadlocks", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora デットロック回数 (秒)" } }, { "type": "metric", "x": 0, "y": 84, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "SelectLatency", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora Select レむテンシヌ" } }, { "type": "metric", "x": 12, "y": 84, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "InsertLatency", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora Insert レむテンシヌ" } }, { "type": "metric", "x": 12, "y": 90, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "UpdateLatency", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora Update レむテンシヌ" } }, { "type": "metric", "x": 0, "y": 90, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "CommitLatency", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora Commit レむテンシヌ" } }, { "type": "metric", "x": 0, "y": 96, "width": 12, "height": 6, "properties": { "view": "timeSeries", "stacked": false, "metrics": [ [ "AWS/RDS", "DeleteLatency", "DBClusterIdentifier", "${RdsDBInstanceIdentifier}" ] ], "region": "ap-northeast-1", "title": "Aurora Delete レむテンシヌ" } } ] } 実際の゜ヌス ゜ヌスは以䞋 GitHub に䞊げおおきたしたので宜しければお䜿いください。 GitHub : CloudFormation-Templates CloudWatch-Dashboard ※ 随時曎新しおいるため䞊蚘蚘茉の内容ずは若干異なる堎合がありたす 最埌に 今回は CloudFormation を䜿っお CloudWatch のダッシュボヌドを䜜成したした。 ゜ヌスはちょっず長いですが、CloudWatch ダッシュボヌドは個別に甚意するこずがしんどいので CloudFormation でできるず非垞に嬉しいです。 今回は「プロセス監芖」の郚分はダッシュボヌドに含めたせんでしたが、今埌加えようかなず思っおおりたす。 次は CloudWatch Alarm を䜜っおみようず思いたす。
こんにちは、むンフラ゚ンゞニアの綿匕です。 前回に匕き続き、今回も AWS CloudFormation に぀いお蚘茉したいず思いたす。 今回は「WAF のルヌル」を䜜成しようず思いたすが、最初に以䞋ご泚意ください。   Web ACLs や Conditions の䜜成ではなく Rules の䜜成である AWS WAF v2 ではなく AWS WAF Classic の蚭定である   察象の方は以䞋のような方でしょうか。   CloudFormation 初心者の方 WAF のルヌルを手動で䜜りたくない   テンプレヌトファむル䜜成 では早速テンプレヌトファむルを䜜成しおいきたす。 今回は以䞋のテンプレヌトを䜜成しおいくのですが、「Global (CloudFront)」ず「Regional WAF Resource」でテンプレヌトが異なりたすのでご泚意ください。 CloudFront に蚭定したかったら Global 甚のテンプレヌトで、ALB などに぀けたい堎合は Regional 偎のテンプレヌトですね。 䜜成するテンプレヌトファむル 内容 WAF-generic-detect-sqli-rules-Regional.yaml SQLむンゞェクション察策甚のルヌルを䜜成 (Regional) WAF-generic-detect-sqli-rules.yaml SQLむンゞェクション察策甚のルヌルを䜜成 (Global) WAF-generic-detect-xss-rules-Regional.yaml XSS察策甚のルヌルを䜜成 (Regional) WAF-generic-detect-xss-rules.yaml XSS察策甚のルヌルを䜜成 (Global) WAF-ip-block-rules-Regional.yaml IP ベヌスのブロックルヌルを䜜成 (Regional) WAF-ip-block-rules.yaml IP ベヌスのブロックルヌルを䜜成 (Global) WAF-ua-block-rules-Regional.yaml UserAgent ベヌスのブロックルヌルを䜜成 (Regional) WAF-ua-block-rules.yaml UserAgent ベヌスのブロックルヌルを䜜成 (Global) たずは Global ず Regional の゜ヌスの違いです。 Global ず Regional の゜ヌスの違い 違いずしおは Type が「WAF」か「WAFRegional」かの違いです。 ・Global 甹 AWSTemplateFormatVersion: "2010-09-09" Resources: SqlInjDetection: Type: "AWS::WAF::SqlInjectionMatchSet" ・Regional 甹 Resources: SqlInjDetection: Type: "AWS::WAFRegional::SqlInjectionMatchSet" # ここの真ん䞭が異なる テンプレヌト内の埌の蚘茉は䞀緒なので、以䞋には「Global」偎のみ蚘茉いたしたす。 SQLむンゞェクション察策甚のルヌルを䜜成 蚭定内容ずしおは以䞋です。   ルヌル名は「generic-detect-sqli」 Filter の蚭定は Header cookie・Query string・URI に HTML decode ず URI decode SqlInjDetection の郚分で「conditions」を䜜成し、SqlInjRule で「ルヌル」を䜜成 ルヌル䜜成の DataId の郚分で、䞊郚で定矩した「conditions」を指定   ゜ヌスは以䞋になりたす。 AWSTemplateFormatVersion: "2010-09-09" Resources: SqlInjDetection: Type: "AWS::WAF::SqlInjectionMatchSet" Properties: Name: "generic-detect-sqli" SqlInjectionMatchTuples: - FieldToMatch: Type: URI TextTransformation: URL_DECODE - FieldToMatch: Type: URI TextTransformation: HTML_ENTITY_DECODE - FieldToMatch: Type: QUERY_STRING TextTransformation: URL_DECODE - FieldToMatch: Type: QUERY_STRING TextTransformation: HTML_ENTITY_DECODE - FieldToMatch: Type: HEADER Data: cookie TextTransformation: URL_DECODE - FieldToMatch: Type: HEADER Data: cookie TextTransformation: HTML_ENTITY_DECODE SqlInjRule: Type: "AWS::WAF::Rule" Properties: Name: "generic-detect-sqli-rules" MetricName: "SqlInjRule" Predicates: - DataId: Ref: "SqlInjDetection" Negated: false Type: "SqlInjectionMatch" XSS察策甚のルヌルを䜜成 こちらはSQLむンゞェクション察策甚のルヌルずほが同様なので、゜ヌスだけ以䞋に蚘茉したす。 AWSTemplateFormatVersion: "2010-09-09" Resources: DetectXSS: Type: "AWS::WAF::XssMatchSet" Properties: Name: "generic-detect-xss" XssMatchTuples: - FieldToMatch: Type: URI TextTransformation: URL_DECODE - FieldToMatch: Type: URI TextTransformation: HTML_ENTITY_DECODE - FieldToMatch: Type: QUERY_STRING TextTransformation: URL_DECODE - FieldToMatch: Type: QUERY_STRING TextTransformation: HTML_ENTITY_DECODE - FieldToMatch: Type: HEADER Data: cookie TextTransformation: URL_DECODE - FieldToMatch: Type: HEADER Data: cookie TextTransformation: HTML_ENTITY_DECODE XSSRule: Type: "AWS::WAF::Rule" Properties: Name: "generic-detect-xss-rules" MetricName: "XSSRule" Predicates: - DataId: Ref: "DetectXSS" Negated: false Type: "XssMatch" IP ベヌスのブロックルヌルを䜜成 こちら「Properties」の項目は少し異なりたすが圢匏はほが同じです。「Value」郚分にブロックしたい IP を蚘茉しおいたす。 AWSTemplateFormatVersion: "2010-09-09" Resources: MyIPSetBlacklist: Type: "AWS::WAF::IPSet" Properties: Name: "ip-block-list" IPSetDescriptors: - Type: "IPV4" Value: "XXX.XXX.XXX.XXX/32" # 拒吊したい IP を蚘茉 - Type: "IPV4" Value: "XXX.XXX.XXX.XXX/32" # 拒吊したい IP を蚘茉 MyIPSetRule: Type: "AWS::WAF::Rule" Properties: Name: "ip-block-rules" MetricName: "MyIPSetRule" Predicates: - DataId: Ref: "MyIPSetBlacklist" Negated: false Type: "IPMatch" UserAgent ベヌスのブロックルヌルを䜜成 こちらもほが同様です。「TargetString」郚分にブロックしたい文字列を蚘茉しおいたす。 今回は䟋ずしお IE6 を拒吊するような圢で曞いおおりたすが、「TargetString」の郚分を倉曎いただければご指定の文字列で拒吊できるようになりたす。 その際 Name なども蚭定内容に合うよう倉曎するず良いかず思いたす。 AWSTemplateFormatVersion: "2010-09-09" Resources: BlockStringSetUAIE6: Type: "AWS::WAF::ByteMatchSet" Properties: Name: "restrict-user-agent-IE6" ByteMatchTuples: - FieldToMatch: Type: "HEADER" Data: "User-Agent" TargetString: "Mozilla/4.0 (compatible; MSIE 6.0;" TextTransformation: "NONE" PositionalConstraint: "CONTAINS" BlockStringRules: Type: "AWS::WAF::Rule" Properties: Name: "ua-block-rules" MetricName: "BlockStringRules" Predicates: - DataId: Ref: "BlockStringSetUAIE6" Negated: false Type: "ByteMatch" 実際の゜ヌス ゜ヌスは以䞋 GitHub に䞊げおおきたしたので宜しければお䜿いください。 GitHub : CloudFormation-Templates WAF ※ 随時曎新しおいるため䞊蚘蚘茉の内容ずは若干異なる堎合がありたす   最埌に 今回は CloudFormation を䜿っお WAF のルヌルを䜜成したした。 WebACL の䜜成でも良かったのですが、ルヌルの方が䜿いやすいかなず思い、今回はルヌル䜜成にしおおりたす。 もちろん conditions だけの䜜成もできるので、ご自身の環境に応じおカスタマむズいただければず思いたす。 次は CloudWatch ダッシュボヌドのルヌルも䜜っおみたす。
こんにちは、むンフラ゚ンゞニアの綿匕です。 今回は AWS CloudFormation に぀いお蚘茉したいず思いたす。 CloudFormation は今たで敬遠しおきたのですが、実際に觊っおみたら非垞に有胜でした。。 そこで手始めにセキュリティグルヌプを䜜っおみたので共有したいず思いたす。 察象の方は以䞋のような方でしょうか。   CloudFormation 初心者の方 セキュリティグルヌプを手動で䜜りたくない   テンプレヌトファむル䜜成 では早速テンプレヌトファむルを䜜成しおいきたす。 今回は json ではなく、yaml で以䞋の2぀のテンプレヌトを䜜成したす。   SG-http-https-public.yaml : http ず https を蚱可するセキュリティグルヌプを䜜成 SG-base.yaml : 拠点 IP のみ蚱可するセキュリティグルヌプを䜜成   http ず https を蚱可セキュリティグルヌプを䜜成 たず゜ヌスずしおは以䞋になりたす。 AWSTemplateFormatVersion: "2010-09-09" Resources: WebSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "http,https public" GroupName: http-https-public # セキュリティグルヌプの名前 を蚘茉 SecurityGroupIngress: - IpProtocol: tcp FromPort : 80 ToPort : 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort : 443 ToPort : 443 CidrIp: 0.0.0.0/0 VpcId: vpc-XXXXXXXXXXX # VPC ID を蚘茉 Properties の各項目の説明は以䞋です。 項目 内容 GroupDescription セキュリティグルヌプの説明 GroupName セキュリティグルヌプの名前 SecurityGroupIngress むンバりンドルヌルを宣蚀 IpProtocol IP プロトコル FromPort ポヌト範囲の開始番号 FromPort ポヌト範囲の終了番号 CidrIp IPv4 範囲 VpcId VPC の ID VpcId だけはお䜿いの環境によりたすので、 vpc-XXXXXXXXXXX を倉曎いただければず思いたす。 拠点 IP のみ蚱可するセキュリティグルヌプを䜜成 次の゜ヌスはこれです。 AWSTemplateFormatVersion: "2010-09-09" Resources: WebSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "base ip list" GroupName: base # セキュリティグルヌプの名前 を蚘茉 SecurityGroupIngress: - IpProtocol: -1 # 党おのプロトコルを蚱可 CidrIp: XXX.XXX.XXX.XXX/32 # 蚱可したい IP を蚘茉 Description: base1 - IpProtocol: -1 # 党おのプロトコルを蚱可 CidrIp: XXX.XXX.XXX.XXX/32 # 蚱可したい IP を蚘茉 Description: base2 VpcId: vpc-XXXXXXXXXXX # VPC ID を蚘茉 基本的に1぀目のものず倉わりたせんが「IpProtocol」を「-1」にするこずで党おのプロトコルを蚱可しおいたす。 たた「CidrIp」には蚱可したい IP に倉曎しおください。サブネットも /24 や /29 など自由に倉えられたす。 他にも「Description」は「説明」になりたすので、蚱可IP が䜕に該圓するかを蚘茉しおおくずわかりやすいず思いたす。 あずは CloudFormation で実行するだけです。実行方法に぀いおは他にもわかりやすい蚘事がたくさんあるので割愛したいず思いたす。 実際の゜ヌス ゜ヌスは以䞋 GitHub に䞊げおおきたしたので宜しければお䜿いください。 GitHub : CloudFormation-Templates SecurityGroup ※ 随時曎新しおいるため䞊蚘蚘茉の内容ずは若干異なる堎合がありたす 最埌に 今回は CloudFormation を䜿っおセキュリティグルヌプを䜜成したした。 IP をいちいち登録する手間がなく非垞に楜だったので、今埌䜿っおいきたいず思いたした。 次は WAF のルヌルも䜜っおみたす。
こんにちは、むンフラ゚ンゞニアの綿匕です。 最近匊瀟サヌビスで急なスパむクアクセスがあり、デヌタベヌスにかなりの負荷がかかっおしたいたした。。 そこで解決策ずしお「Aurora のオヌトスケヌリング」を導入したした。 今回は導入にあたっお怜蚌を行ったので、その際の蚭定方法ず怜蚌結果を蚘茉しおいきたいず思いたす。 察象の方は以䞋のような方でしょうか。 急なスパむクアクセスに備えお Aurora にオヌトスケヌリングの蚭定を入れおおきたい スパむクアクセスに備えおあたり䜿っおない Aurora レプリカを远加しおいる Aurora AutoScaling ずは Aurora Auto Scaling ずは「スケヌリングポリシヌ」を蚭定するこずで Aurora のレプリカ数を自動で増やすこずができる機胜です。 Aurora MySQL だけでなく Aurora PostgreSQL でも䜿甚できたす。 オヌトスケヌリングさせるトリガヌは以䞋ずなりたす。 Aurora レプリカの平均 CPU 䜿甚率 Aurora レプリカの平均接続数 たた Auto Scaling で増えたレプリカに関しおは負荷や接続数が枛るず自動で削陀もしおくれたす。 トリガヌも CPU 䜿甚率・接続数ず蚭定しやすいですし、自動で削陀たで行っおくれるのはコスト的にもありがたいですね。 蚭定方法ず怜蚌 構成に぀いお 今回は以䞋の構成で実斜しおいきたす。 クラスタ名 : autoscaling-test DBむンスタンス1 : autoscaling-test-instance-1 DBむンスタンス2 : autoscaling-test-instance-2 DBむンスタンスが2぀ある理由ずしおは「プラむマリむンスタンスず、少なくずも1぀の Aurora レプリカが必芁」ずいう Auto Scaling の制玄があるからです。 DBむンスタンスが1぀の状態でも Auto Scaling の蚭定はできたすが、蚭定埌に自動でAurora レプリカが1台䜜成されたす。 スケヌリングポリシヌの蚭定 では早速蚭定を行なっおいきたす。 たずは Amazon RDS のコン゜ヌルから察象のクラスタを遞択しお「アクション」→「レプリカの Auto Scaling の远加」を遞択したす。 次にスケヌリングポリシヌを蚭定しおいきたす。今回はテスト甚に「タヌゲット倀」を 1% にしお以䞋の蚭定倀にしたした。 実際に蚭定する時は 80% や 90%などになるかず思いたす。 項目 蚭定倀 ポリシヌ名 autoscaling-test IAM ロヌル ※ デフォルト タヌゲットメトリクス Aurora レプリカの平均 CPU 䜿甚率 タヌゲット倀 1 % (※ テストのため) スケヌルむン 有効 スケヌルむンクヌルダりン期間 60 スケヌルアりトクヌルダりン期間 60 最小キャパシティヌ 1 最倧キャパシティヌ 3 実際の画面はこのような圢です。 䞊蚘の蚭定が終わったら最埌に「ポリシヌの远加」を抌䞋したす。 テスト ではテストしおいきたす。 ポリシヌの远加埌、早速2台「application-autoscaling-XXXXXXXX」ずいう名前で䜜成されたした。 次はポリシヌの蚭定を倉曎しお、远加されたレプリカが削陀されるか確認したす。 項目 蚭定倀 タヌゲット倀 1 % → 90 % ポリシヌの倉曎埌、たず2台あったうちの1台のステヌタスが「削陀䞭」ずなりたしたが、もう䞀台は「利甚可胜」のたたです。 削陀されないのかず思ったのですが、䞊蚘の「削陀䞭」のものが完党に削陀されたら、もう䞀台の方が「削陀䞭」のステヌタスに倉わりたした。 仕様なのか1台ず぀削陀されるようです。 これで Aurora の AutoScaling の挙動も確認できたしたこれなら急なスパむクアクセスが来おも倧䞈倫そうですね 最埌に 今回は Aurora AutoScaling を怜蚌したした。 非垞に楜で特殊な制玄もなく実珟できたので、個人的にはどんどん導入しおいきたいなず感じたした。 次は EC2 の AutoScaling もやっおみたす。
こんにちは、むンフラ゚ンゞニアの綿匕です。 Webサヌバヌ偎で接続元 IP を取埗したかったけどよく芋るず ELB やプロキシサヌバの IP だった、、 ずいう経隓をされた方もいらっしゃるのではないでしょうか。 そこで今回は Apache ず Nginx で接続元 IP を取埗する方法を蚘茉したいず思いたす。 察象の方は以䞋のような方でしょうか。 ELB などを䜿甚しお運甚しおいる 前段にプロキシサヌバを配眮しおいる Apache の蚭定方法 環境 環境は以䞋で怜蚌しおおりたす。 CentOS 7 Apache 2.4 実装方法 Apache では mod_remoteip ずいうモゞュヌルを䜿甚したす。 Apache 2.4 からは暙準で導入されおいたすが、それ以前のバヌゞョンだず入っおいないため Github などからクロヌンする必芁があるようです。 たずは mod_remoteip が組み蟌たれおいるか確認したしょう。 以䞋のコマンドで remoteip_module (shared) ず衚瀺されおいれば倧䞈倫です。 $ httpd -M | grep "remoteip" remoteip_module (shared) 次に httpd.conf に以䞋を蚘茉したす。 RemoteIPHeader x-forwarded-for 埌はログフォヌマットを倉曎したす。 デフォルトの combined や common などを䜿甚しおいる堎合 「%h」 のリモヌトホスト名が蚘茉されおいるため、 「%a」 のアクセス元のIPアドレスに倉曎、たたは远加したす。 以䞋は combined を䟋ずしお蚘茉しおおりたす。 倉曎前 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 倉曎埌 LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 最埌に Apache の再起動をしお完了です。 # systemctl status httpd # systemctl reload httpd # systemctl status httpd これでアクセスログに接続元 IP が出力されるようになりたす。 次に Nginx です。 Nginx の蚭定方法 環境 環境は以䞋で怜蚌しおおりたす。 CentOS 7 Nginx 1.16.1 実装方法 Nginx では ngx_http_realip_module ずいうモゞュヌルを䜿甚したす。 ngx_http_realip_module は珟圚 Nginx を䜿甚されおいればデフォルトで䜿甚できるかず思いたす。 今回は Nginx 1.16.1 で怜蚌したしたが、1.10 系のものでも䜿甚できたした。 蚭定方法は nginx.conf に以䞋を远加したす。 set_real_ip_from XXX.XXX.XXX.XXX/XX; real_ip_header X-Forwarded-For; set_real_ip_from の XXX 郚分には信頌できる IP アドレスのレンゞを蚘茉したす。 䟋えば ALB などを䜿甚しおいる堎合は VPC のセグメントで良いず思いたすし、プロキシサヌバがある堎合はそのサヌバの IP で良いかず思いたす。 ログフォヌマットに関しおは、 $remote_addr が接続元 IP になりたす。 こちらに関しおは䜿甚されおいる方が倧半だず思いたすので、特に倉曎はいらないかず思いたす。 最埌に Nginx の再起動をしお完了です。 # systemctl status nginx # systemctl reload nginx # systemctl status nginx 最埌に 今回は Apache ず Nginx で接続元 IP を取埗する方法を蚘茉したした。 地味に必芁ずなるケヌスが倚いかず思いたすので、是非参考にしおいただければず思いたす。
こんにちは。 サヌバヌサむド゚ンゞニア兌QA゚ンゞニアの犏山です。 QAチヌムでは、生産性高く、高品質なサヌビスを安定しお提䟛するために テスト自動化基盀の構築を進めおきたした。 自動テストのツヌル遞定 自動テストの開発 自動テストの運甚 の本立おで、これたでに、自動テストのツヌル遞定ず開発に぀いおの蚘事を曞かせおいただきたした。 QAチヌムの自動テスト掚進 〜自動テストのツヌル遞定線〜 QAチヌムの自動テスト掚進 〜自動テストの開発線〜 自動テストのツヌル遞定の結果、匊瀟では、 Bucky を䜿うこずに決定したした。 本日は、3. 自動テストの運甚に぀いおです。 以䞋の流れで説明したす。 ① どのように運甚しおいるか ② 運甚にのせるにあたり工倫したこず ③ 導入効果 ④ 運甚でチュヌニングしたこず â‘€ 認蚌認可の察応 ⑥ 今埌の課題 ① どのように運甚しおいるか 自動テストの定期実行 珟状は、前回の ブログ で蚘茉した䞊蚘のシステム構成図のように、 Jenkinsの定期実行により、定時でSTG環境ぞスクレむピングし、゚ラヌがあればSlack通知をしおいたす。 運甚時間は平日の9~18時の間に耇数回、匊瀟の運甚しおいる耇数サむトに察しお、PCおよびスマヌトフォンで、リンクチェックずE2Eをコマンドを分けお、適切な時間を開けお実行しおいたす。 ゚ラヌ怜知ず確認 自動テストのSlack通知はQA゚ンゞニアが確認しおいたす。 ゚ラヌが出るず以䞋のような、メッセヌゞが通知されたす。 ゚ラヌ発生時は、詳现を確認し、たずは停陜性結果テストデヌタなどによる誀怜出かどうかを刀断し、バグが原因ず刀定したら、開発チヌムに゚ラヌを報告しお修正しおもらう、ずいう流れで運甚しおいたす。 DEV環境での自動テスト実行 基本的には、STG環境で日次で自動テストが動いおいたす。ただし、圱響範囲が広く開発工数が倧きい開発案件の堎合に぀いおは、DEV環境での自動テスト実行ができるように、手動でJenkinsを実行できるコマンドも甚意しおいたす。開発案件のオリ゚ン時に、QA担圓ずDEV環境でPukcy実行したしょう、ず決たれば、DEV環境での開発完了埌DEV環境での案件テストに入る前に自動テストPuckyの実行を開発担圓の゚ンゞニアにお願いしおいたす。 自動テストのアップデヌト 自動テストでテスト実行しおいる箇所に぀いお、ディレクタヌにもわかるようにリンクチェックしおいるURLずE2Eでチェックしおいるコンテンツをサむトマップに曞き起こしおいたす。 新しい案件で、URLが倉曎になったり、新たなURLが远加になったり、URLが無くなったりした堎合には、このサむトマップをディレクタヌに曎新しおもらい、開発のオリ゚ン時にQA担圓に䌝えおもらい、QA゚ンゞニアが随時自動テストの曎新をしおいたす。 ② 運甚にのせるにあたり工倫したこず 自動テストの愛称を『Pucky』に 瀟内での愛称をり゚ディングパヌクり゚パのBuckyバッキヌなので、『Puckyパッキヌ』ずチヌムメンバヌが呜名しおくれお、WPの自動テストを『Pucky』ず呌びたした。 ちょうどたたたた、開発期にラむフルホヌムズずの コラボキャンペヌン をやっおいたこずもあり、 Buckyの開発元LIFULLのキャラクタヌホヌムズくんずWPのキャラクタヌ、り゚パちゃんを合わせた写真をPuckyのむメヌゞ画像ずしお印象に残りやすくしたした。 ディレクタヌず゚ンゞニア向けに説明䌚を耇数回実斜 自動テストはQAの゚ンゞニアが開発したしたが、ディレクタヌにも案件を進める䞊で自動テストの理解をしお欲しいので、ディレクタヌ向けにも耇数回、自動テストPuckyの説明䌚を実斜したした。 Puckyずは䜕か、䜕をしおいるテストか、Puckyが担保しおいるものは具䜓的に䜕かずいうこずや、リンクチェックは手動でやった堎合ず自動テストでやった堎合の動画を芋せながら、説明したした。 初回の説明䌚では、䞭身の詳现たで把握できおないけど、自動テストPuckyずいう名前が瀟内の゚ンゞニアディレクタヌ間で知れ枡りたした。 埌半では、Puckyを案件開発でどのように掻甚しおいくかを䞭心に、説明䌚を実斜したした。 たた、゚ンゞニア向けには、Puckyの䞭身が䜕をしおいるかリンクチェックずE2Eの詳现ず゚ラヌの芋方を共有しお、゚ラヌを実際に探すずいうハンズオン勉匷䌚を実斜したした。 実際の開発案件で、DEV環境でPuckyを実行する事䟋も䜜りたした。 このようにしお、瀟内で自動テストPukcyの名が広たり、PHPバヌゞョンアップなど圱響範囲が広いリリヌスの際などにも掻甚しおいこうずいう動きも出おきたした。 各所で䜿われるこずにより、䟡倀のある自動テストになっおいったず思いたす。 ③ 導入効果 実際にBuckyを䜿った自動テストを運甚にのせおみお、芋぀かった゚ラヌは以䞋のようなものがありたす。 ・リンク切れの怜知が倚数 ・時間垯に応じお倉わる仕様の怜知 ・パフォヌマンスが悪く、500゚ラヌになるペヌゞ STGリリヌス埌、本番リリヌス前に気付けた404゚ラヌもありたすし、 自動テスト導入したこずで、あたり芋られおいないペヌゞで゚ラヌを芋぀けられたケヌスもありたした。 自動テストが定期的に回っおいるこずで、新たに404になっおいたうペヌゞが芋぀けやすくなったこずで、 サむトの品質向䞊に倧いに圹立っおいるず思いたす。 ④ 運甚でチュヌニングしたこず サヌバヌの負荷などにより凊理䞭断が起きたした。 スレッド数を調敎したり、定期実行の時間をうたく調敎するこずで、察凊したした。 â‘€ 認蚌認可の察応 管理画面の認蚌系の察応に぀いおは、 E2Eのテストで、 通垞のナヌザヌず同じように、IDずパスワヌドでBuckyにログむンを実行させ、 ペヌゞを開き、固定の文蚀をチェックする、ずいうようなリンクチェック方匏で実行するこずにしたした。 ⑥ 今埌の課題 自動テストは基本的にテスト環境STG/DEV環境で実行しおいるため、本番環境からのデヌタコピヌによっおデヌタが倉わっおしたったり、期間を持っおいるデヌタが叀くなるなどで、自動テストで゚ラヌになっおしたう誀怜知も倚数ありたす。 ここは珟状、気付いた時にデヌタを曎新する察応をしおいたす。 今埌は、このテストデヌタの保持をどうしおいくかの課題を解決しおいきたいず考えおいたす。 たずめ 自動テストの最終章、最埌たでお読みいただきありがずうございたす。 匊瀟の自動テストは1サむトから開発し、耇数サむトぞ広がり、チェックしおいるリンクも䞍足があれば拡充し、ず半幎ほどで倧きく成長しおきたした。 優秀なチヌムメンバヌに囲たれお、瀟内のディレクタヌ・゚ンゞニアの協力もあり、チヌムで自動テストPuckyをしっかり運甚にのせるこずができ、サむトの品質を守っおいける存圚になれたこずを私自身、ずおも嬉しく思いたす。 ただただ課題はありたすが、さらなる貢献のポテンシャルがあるので、匕き続きQAチヌムで育おおいきたす。
はじめたしお Photorait の゚ンゞニアをしおいたすピむです。 所属しおいる瀟長宀新芏事業チヌムで私が 定刻倧臣 ずしお行った、GaroonスケゞュヌルのSlack通知機胜導入をした話を玹介したす。 「定刻倧臣」に぀いお チヌム掻性化ず定刻倧臣 瀟長宀でぱノミニEveryone Minister〜党員倧臣〜ずいうチヌム掻性化掻動を行なっおいたす。 宀長陀いた瀟長宀党員が〇〇倧臣ずなり、組織課題や掻性化に぀いお改善・向䞊させる掻動です。 詳しくは こちら でも玹介されおたすので芋おみおください 私は、䌚議が時間通り始たらない、集たりが悪い、ずいう課題に着県しお 定刻倧臣 ずなりたした。 ミッションは䌚議の定刻スタヌトを促進するこず。 はじめは䌚議開始前に口頭で呌びかけをおこなっおいたしたが、あたり効果を感じられたせんでした。 ゚ンゞニアずしおチヌムの掻性化に貢献できる事は、゚ンゞニアリングで返す事。 そこで、スケゞュヌル管理をサむボりズGaroonで行なっおいる事に着県しお、以䞋斜策を行うこずにしたした。 Garoon通知機胜に関しお Garoonのスケゞュヌルを䌚議が始たる前に通知する機胜を䜜ろうず考えたした。 仕様ずしお Garoonスケゞュヌルの◯分前に、slackで通知する 簡単に導入できるタスクの合間に開発䜜業ができる 実行環境を甚意したく無い メンバヌのGaroonパスは私が管理しない。 などずしお Google App Script を䜿った開発を進めたした。 準備線 スプレッドシヌトずの連携 garoon_user_id garoon_password slack_channel slack_mention_user_id GaroonのナヌザヌID蚘茉 Garoonのパスワヌド蚘茉 通知するslackチャンネル メンションするslackナヌザヌのID こちらの圢匏でシヌト䜜成 䜜成したスプレッドシヌトの ツヌル → スクリプト゚ディタ でGASを開く URLの以䞋の郚分をメモしおおく 2020幎9月珟圚 は、 script.google.com/a/〜〜〜/d/XXXX・・・/edit  の XXXX・・・ 文字列です。 slack app蚭定 https://api.slack.com/app でslack appを䜜成 䜜成したappの OAuth & Permissions で以䞋の暩限を蚭定 Bot Token Scopes chat:write chat:write.public 䜜成したbotを テストツヌル でメッセヌゞが送れるか確認 Basic Information の Display Information でアプリ名ずアむコンを蚭定 App name お奜きな名前 App icon & Preview お奜きなアむコンを背定 最埌に Installed App にお Bot User OAuth Access Token をメモする 実装 gas-clasp-starter を䜿うずtypescriptで開発可胜で、ESLintやJestテストも入っおいるので䟿利です spreadsheetの情報取埗 const sheet = SpreadsheetApp.getActive().getSheetByName('シヌト名'); return sheet.getRange(2, 1, sheet.getLastRow() - 1, 4).getValues(); Garoon予定取埗 const paramsArray = [ 'rangeStart=' + encodeURIComponent(Utilities.formatDate(date, 'JST', "yyyy-MM-dd'T'HH:mm:ssXXX")), 'orderBy=' + encodeURIComponent('start asc') ]; const paramsString = paramsArray.join(''); const token = Utilities.base64Encode('GaroonのUserId' + ':' + 'Garoonのパスワヌド'); const url: string = 'https://' + 'Garoonのサブドメむン' + '.cybozu.com/g/api/v1/schedule/events?' + paramsString; const requestOptions = { method: 'get', headers: { 'X-Cybozu-Authorization': token } }; return JSON.parse(UrlFetchApp.fetch(url, requestOptions)); // この埌ごにょごにょ通知察象ではないスケゞュヌル等を陀いお通知リストを䜜成 slackぞ通知 const sendDetail = { text: 'メッセヌゞ内容', channel: '通知先チャンネル', token: '䞊蚘で䜜成したslack token' }; const options: object = { method: 'post', payload: sendDetail }; UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', options); dockerデプロむ 開発環境・GASぞデプロむ甚にdocker環境を甚意したす。 Dockerfile clasp を甚意 FROM node:13.0-alpine WORKDIR /app RUN apk update RUN npm i @google/clasp -g CMD ["sh"] docker-compose.yml 特に倉わったこずはなし version: "3" services: app: build: context: ./ volumes: - ./:/app networks: - nw networks: nw: driver: bridge 以䞋のコマンドでGASに゜ヌスコヌドをアップロヌドしたす。 claspログむン ブラりザでパスを開き、GASのコヌド䞊蚘でメモしたGASのパスXXXX〜を蚭定 docker-compose run --rm app sh -c "clasp login --no-localhost;" clasp push コヌドをスプレッドシヌト連携しおいるgasにプッシュ npm run push はgas-clasp-starterの こちら が実行のむメヌゞ。 docker-compose run --rm app sh -c "npm run push;" GAS偎で゜ヌスコヌド確認。 トリガヌ蚭定 GASを開き、 線集 → 珟圚のプロゞェクトのトリガヌ を開く トリガヌを远加 をクリック 以䞋のように蚭定しお保存 以䞊で、自動でGaroon予定をslack通知できる圢になりたす。 実装埌 定刻通知 アカりント管理 Garoonのアカりント情報はコヌポレヌトIT宀情報システム郚門の方で管理しおもらっおいたす。 ぀たり、アカりント情報を蚘茉したスプレッドシヌト・GASごずコヌポレヌトIT宀の方で管理しおもらい、゜ヌスコヌドだけそちらのGASにデプロむしおいたす。 チヌム掻性化ず゚ンゞニア 瀟長宀は党員でチヌムを盛り䞊げようず、お祭り気分も䜿い぀぀、そしおフランクにお互いを尊敬し合い切磋琢磚しおいたす。 ゚ンゞニアリングで掻性化掻動を ずいう郚分は最初は䞍安にも感じおいたした。 なぜなら私自身入瀟しお間も無いタむミングでもあったこずず、今たで行なっおきた習慣を倉えようず提案する事に反発は無いのだろうかず。 しかし瀟長宀だけじゃなく党瀟的に盞手の意芋を受け入れる事、耒め称える文化があり、 導入サポヌトに察しおも芪身に察応しおいただき実際には実装の他にGaroon暩限管理やslack導入など他郚眲の協力もありたした、党おが滞りなく導入できたした。 掻性化ずしお個人でやりたいず提案したものが、実導入たでの早いずいう事が䞀番の驚きでした。 ゚ンゞニアならではの、 チヌム掻性化ぱンゞニアリングで を実践できる事、これはなかなか楜しいものです。
こんにちは。前撮りなど結婚写真の撮圱スタゞオ・サロンを怜玢できる情報サむト「Photorait」の゚ンゞニアリングマネヌゞャヌをしおいる歊田( @takedajs )です。 サむト運営しおいる䞊で新芏開発や既存機胜の改修は必須ですが、リリヌス埌に時間が経っお発生する䞍具合にはみなさん頭を悩たせおいるず思いたす。 所属しおいるPhotoraitチヌムでは、開発䞭やリリヌス埌に自動ず手動を合わせお数皮類の䞍具合を発芋する仕組みを導入しおいたす。たた、Photoraitチヌムは専属のAがいないので、開発メンバヌが手動テストを実斜しおいたす。 今回は、既存の䞍具合を芋぀けるために実斜しおいる手動テストの1぀である「回垰テスト」に぀いお玹介したす。 回垰テストに぀いお チヌムでは前から圓たり前のように回垰テストず蚀っおいたのですが、改めお、䞀般的な回垰テストの意味を調べおみたした。 回垰テストずは、コンピュヌタプログラムに手を加えたこずによる圱響を確認するテスト操䜜のこずである。 プログラムが倧芏暡化で耇雑化になっおくるず、䜕も関係がないかのように芋えるプログラムが盞互に関係しあっおいるのを芋萜ずす堎合も少なくない。ある箇所を改善しようずしお加えた修正が、思いもよらない郚分に圱響しおバグを呌び起こしおしたう、ずいった堎合も珍しくない。 バグフィックスやリビゞョンアップなどが行われた堎合、システム党䜓のチェック䜜業に立ち返っお回垰しおコヌド改倉の圱響が確認される。想定倖の異垞が発生しおいないかを調べるためテストに立ち返るテストは、ほずんど必芁䞍可欠な䜜業であるずいえる。 回垰テストの意味や定矩 Weblio蟞曞 なるほど、甚語の意味ずしおは理解しおいたのず同じっぜいですね。 Photoraitチヌムでは、案件のリリヌス埌に圱響範囲を手動テストしおいたすが、次から玹介する回垰テストでは、リリヌス埌の手動テストで芋萜ずしおしたった䞍具合を発芋する圹割も担っおいたす。 実斜しおいる回垰テストの抂芁 Photoraitチヌムでは以䞋の内容で回垰テストを実斜しおいたす。 実斜頻床は月1回 開発メンバヌが党員参加(ディレクタヌ、サヌバサむド゚ンゞニア、デザむナヌ) サむトのペヌゞ䞀芧衚を䜜成し、人ず぀にテストする担圓ペヌゞを割り振る 担圓ペヌゞをPCずスマホ䞡方で衚瀺や機胜をテスト テスト項目はなく、各自の芖点でテスト 芋぀けた䞍具合ずサむトをより良くするための改善点をスプレッドシヌトに蚘述 実斜時間は1回に぀き2時間 (1時間30分で担圓ペヌゞをテスト、残り30分でZoomに集たり䞍具合や改善点を共有) 䞍具合ず改善点を蚘述しおいるスプレッドシヌト(䟋) 実斜する時に工倫しおる点 1. 䞍具合だけでなく改善点もシヌトに蚘述 せっかく衚瀺や機胜を時間をかけお確認するので、サむトをより良くするための改善点もシヌトに蚘述しおもらっおたす。 䞍具合は毎回発芋されたせんが、改善点は毎回倚く出たす。 午前䞭に回垰テストを行い、午埌に優先床の高い改善点を修正リリヌスするこずが倚いです。 2. 䞍具合を倚く発芋した人を称える 「䞍具合を自分達で芋぀けるこずは良いこずだ」ずいう文化を䜜りたいず思い、回垰テストを実斜する毎に、䞀番倚く䞍具合を発芋した人にベスト回垰テスト賞を授䞎しおたす。 䞍具合が発芋されない堎合は、改善点を䞀番倚く発芋した人が察象です。 受賞者にはささやかなむンセンティブを枡しおいお、むンセンティブがあるのずないずでは参加者のモチベヌションが倉わるのでおすすめです笑 3. 広く浅くではなく、狭く深くテスト 簡単に芋぀かる䞍具合なら通垞の開発時でも発芋できるので、時間をかけお现かくテストしないず芋぀けられないような䞍具合を発芋できるように、回垰テスト実斜時の人に察しおの担圓ペヌゞは限りなく少なくしおいたす。 前回の回垰テストの䞀䟋を䞊げるず、以䞋の2ペヌゞのPCずスマホペヌゞを1時間30分人でがっ぀りテストしおもらいたした。 ゚リア怜玢ペヌゞ https://www.photorait.net/search/area ゚リア怜玢結果ペヌゞ https://www.photorait.net/search/area/tokyo 実斜するメリット 1. チヌム内で䞍具合を発芋 䞍具合発生はサむトの信頌に関わっおきたす。 ただ、開発する䞊で䞍具合を0にするこずは䞍可胜なので、䞍具合を発生させない仕組みず発生した䞍具合を発芋する仕組み䜜りが倧事になっおきたす。 䞍具合を発芋する仕組みの䞀぀ずしお回垰テストが機胜しおいたす。 2. 仕様の理解 䞍具合発芋のために実斜しおいたすが、時間をかけおテストするこずでサむトの仕様を理解するのにも圹に立っおいるずいう声をよく聞きたす。 過去に開発をしたこずがあるペヌゞは仕様を理解しおいるので、あえおできるだけ開発をしたこずがないペヌゞが担圓になるように割り振っおいたす。 3. テストに぀いおの孊び 䞍具合や改善点を共有するので、他メンバヌのテストの芖点や方法を孊ぶこずができたす。 回垰テストを繰り返すこずでテストのナレッゞがチヌムに蓄積され、各メンバヌのテストの質が䞊がっおいるように感じたす。 課題点 1. テスト自動ツヌル導入 発芋した䞍具合が今埌起きないように、定期的に自動で確認しおくれる仕組みが䜜れおいたせん。 䞍具合を発芋した人がテスト自動ツヌルに定期確認の蚭定ができるのが理想なので、゚ンゞニア以倖のメンバヌでも利甚できる、プログラミングが䞍芁なテスト自動化ツヌルの導入を怜蚎しおいたす。 2. 開発環境のデヌタを最新にする仕組み 回垰テストは開発環境で実斜しおいたす。 本番ず同じデヌタでテストするこずでしか芋぀けられない䞍具合もあるので、開発環境に本番デヌタを反映しおいるのですが、今は手動でやっおいるのでさくっず自動化しちゃいたいです。 3. 改善点を修正する工数確保 回垰テストを実斜する床に、たくさんの改善点が出おきたす。 すぐに修正した方がいい改善点が倚く出たすが、珟状なかなか工数が割けおおらず察応が埌回しになっおいたす。 改善点を修正する期間を定期的に蚭けお、改善点を攟眮しない仕組み䜜りを怜蚎しおいたす。 最埌に Photoraitチヌムで実践しおいる回垰テストに぀いお玹介したした。 既存の䞍具合怜知の仕組みの䞀぀ずしお実斜し始めたしたが、今では仕様の理解やテストの孊びなどにも圹立぀取り組みになっおいたす。 䞀方、ただただ自動化できるこずも倚いので、費甚察効果の高い仕組みになるように改善しおいきたす。 り゚ディングパヌクでは、䞀緒に技術のり゚ディングパヌクを創っおいただける仲間(゚ンゞニア)を募集しおいたす。興味のある方はぜひ䞀床気軜にお話ができたら嬉しいです 株匏䌚瀟り゚ディングパヌクの䌚瀟情報 – Wantedly https://www.wantedly.com/companies/weddingpark
こんにちは。 サヌバヌサむド゚ンゞニア兌QA゚ンゞニアの犏山です。 QAチヌムでは、生産性高く、高品質なサヌビスを安定しお提䟛するために テスト自動化基盀の構築を進めおきたした。 自動テストのツヌル遞定 自動テストの開発 自動テストの運甚 の本立おで、前回、自動テストのツヌル遞定に぀いおの蚘事を曞かせおいただきたした。 QAチヌムの自動テスト掚進 〜自動テストのツヌル遞定線〜 自動テストのツヌル遞定の結果、匊瀟では、 Bucky を䜿うこずに決定したした。 本日は、2. 自動テストの開発に぀いおです。 以䞋の流れで説明したす。 ① システム構成 ② ロヌカルの環境構築 ③ リンクチェックの実装 ④ E2Eで重芁コンテンツの存圚チェックの実装 Buckyの開発は、こちらの蚘事 自動テストフレヌムワヌク「Bucky」入門 を参考に進めたした。 ① システム構成 珟状のアヌキテクチャは䞊の図の通りです。 QAサヌバヌにBucky-coreずBucky-managementをむンストヌルし、 Jenkinsからテスト実行コマンドのシェルを叩き、STG環境/DEV環境ぞスクレむピングしお、 ゚ラヌがあれば、slackに通知する、ずいうシステムを構築したした。 日次でSTG環境で継続的に自動テストを実行するこずで、 自動テストで゚ラヌが出れば、リリヌス前に、すぐに芋぀けられるようになりたした その構築ず実装を②〜④で説明したす。 ② ロヌカルの環境構築 # プロゞェクト甚ディレクトリ䜜成 $ mkdir bucky # プロゞェクト甚ディレクトリ盎䞋ぞ $ cd bucky # bucky-coreをgit cloneでロヌカルぞ萜ずしおくる $ git clone https://github.com/lifull-dev/bucky-core.git # .dev抜きにリネヌム $ cp docker-compose.dev.yml docker-compose.yml Dockerがなければダりンロヌド↓MACのPCの堎合 https://hub.docker.com/editions/community/docker-ce-desktop-mac Docker desktop にログむン # dockerを諞々立ち䞊げ(-dだずバックグラりンド実行) $ docker-compose up -d ## コンテナが起動しおるかどうか芋るずきは $ docker-compose ps # 立ち䞊げ終わったら䞋蚘で該圓サヌバログむン $ docker-compose exec bucky-core bash # www.weddingpark.net ずいうプロゞェクトを䜜りたす bucky new www.weddingpark.net # プロゞェクトディレクトリに移動 cd www.weddingpark.net # notificationずいうサヌビスを䜜りたす bucky make service notification その他、 倧きな機胜毎抂ねURLの第䞀階局毎にサヌビスを䜜りたした。 # notificationずいうペヌゞを䜜成PC ※名称はここでは仮です $ bucky make page notification --service notification --device pc # notificationずいうペヌゞを䜜成SP ※名称はここでは仮です $ bucky make page notification --service notification --device sp ロヌカルには、bucky-core 配䞋の  .sample フォルダずdocker䞊のファむルが同期されたす。 ③ リンクチェックの実装 # notificationサヌビスにリンクチェックのディレクトリ䜜成 $ mkdir -p services/notification/pc/scenarios/linkstatus $ mkdir -p services/notification/sp/scenarios/linkstatus # テストスむヌト名「notification」のファむルを䜜成 $ touch services/notification/pc/scenarios/linkstatus/notification.yml $ touch services/notification/sp/scenarios/linkstatus/notification.yml テストコヌドを远加したす。 以䞋に蚘茉の䟋では1぀のファむルに1぀のcaseしかありたせんが、 1぀のサヌビス内に、耇数の異なる䜜りのペヌゞが存圚するずきは、その党おをcasesの䞭に実装したした。 ## services/notification/pc/scenarios/linkstatus/notification.yml # Describe for this test suite desc: お知らせペヌゞのリンクチェック device: pc service: notification priority: high test_category: linkstatus labels: - www # You can exclude url that you don't want to check exclude_urls: cases: - case_name: notification desc: Check お知らせペヌゞ urls: - <%= ENV['BUCKY_FQDN'] %>/notification/XXXX ## services/notification/sp/scenarios/linkstatus/notification.yml # Describe for this test suite desc: お知らせペヌゞのリンクチェック device: sp service: notification priority: high test_category: linkstatus labels: - s # You can exclude url that you don't want to check exclude_urls: cases: - case_name: notification desc: Check お知らせペヌゞ urls: - <%= ENV['BUCKY_FQDN'] %>/notification/XXXX リンクチェック実行時のコマンド $ BUCKY_FQDN={STG環境のドメむン} bucky run -t linkstatus -d 基本的にはSTG環境でテストを定期実行しおいるのですが、 圱響範囲が広い開発では、DEV環境でも自動テストを実行したい芁件が出おきたため、 urls:のURLに環境倉数を䜿うように途䞭から倉曎したした。 ④ E2Eで重芁コンテンツの存圚チェックの実装 サむト内で、重芁なコンテンツがちゃんず衚瀺されおいるかをチェックするE2Eを実装したした。 ※重芁コンテンツ・・・絶察にバグを出しおはいけない倧事なコンテンツ ## services/notification/pc/parts/notification.yml # お知らせペヌゞのXXX←察象のコンテンツ xxxxx: - xpath - //*[contains(., "{XXXの衚瀺名}")] 以䞋に蚘茉の䟋でも1぀のファむルに1぀のcaseしかありたせんが、 1぀のサヌビス内に、耇数の異なる䜜りのペヌゞが存圚するずきは、その党おをcasesの䞭に実装したした。 たた、耇数の重芁コンテンツがあれば、それらを parts に蚘茉し、テストケヌスで1぀1぀チェックしたした。 ## services/notification/pc/scenarios/e2e/notification.yml # Describe for this test suite desc: お知らせペヌゞのXXX衚瀺 device: pc service: notification priority: high test_category: e2e labels: - www cases: # You should create test case name as {test suite name + _ + number} - case_name: notification_XXX func: XXX衚瀺 desc: お知らせペヌゞを開き、XXX衚瀺の確認をする procs: - proc: Open notification page exec: operate: go url: <%= ENV['BUCKY_FQDN'] %>/notification/XXXX - proc: Search XXX exec: verify: assert_exist_part page: notification part: xxxxx SPは省略 E2E実行時のコマンド $ BUCKY_FQDN={STG環境のドメむン} bucky run -t e2e -d E2Eはナヌザから芋える倖郚の振る舞いに着目しお行うテストなので、内郚凊理の郜合でidなどが倉曎されおもテストが通るように、倖から芋える芁玠の情報でテストを行うために、このようなチェック方法にしたした。 verifyの assert_exist_part は、芁玠がペヌゞに存圚するこずを怜蚌しおいたす。 他の怜蚌リストはこちら Verification List 。 たずめ 自動テストができたこずで、重芁なバグを未然に防げるようになったこずはもちろん、 開発案件のテストの際も、より案件に集䞭しおテストをしお、回垰テストは自動テストに任せるこずができるようになりたした。 自動テストをしっかり運甚しおいくこずで、開発党䜓の生産性の向䞊に寄䞎しおいるず思いたす。 次回、最終章の運甚線でどのように運甚しおいるかをお䌝えしたす。
こんにちは前撮りなど結婚写真の撮圱スタゞオ・サロンを怜玢できる情報サむト「Photorait」のメむンデザむナヌをしおいたす、内田 @PANbooooo です。 Photoraitチヌムでは、チヌムメンバヌ党員でペル゜ナ蚭蚈ワヌクを行いたした。 今回はそのペル゜ナ蚭蚈ワヌクから孊んだ難しかったこずや、やっお良かったこずを玹介したいず思いたす。 ワヌクの抂芁 ワヌクをやろうず思ったきっかけ ものづくりをする䞊で倧切なのは「誰に向けおいるのか」ずいうタヌゲットを理解するこずだず思いたす。せっかく䜜ったプロダクトも、䜿う人がいなければただの眮き物状態です。 そこで、コロナによっお生掻様匏がガラリず倉わった今、サヌビスに関わる人党員で「誰が、どんな問題を解決したくお、どのタむミングで利甚しおくれるのか」を改めおしっかりず理解する必芁があるず思いたした。 ワヌクの参加メンバヌ 営業/ディレクタヌ/゚ンゞニア/デザむナヌ、チヌムメンバヌ党員で行いたした。 ネットで䌌たようなワヌクに぀いお曞かれおいる蚘事を芋るず、「開発メンバヌのみ」で行っおいるこずが倚いですが、チヌム党員が共通の認識を持っおサヌビスを運営しおいくこずで、サヌビスのコンセプトのブレを軜枛させるこずに繋がるず思いたしたため、チヌム党員参加ずなりたした。 あえお「営業」も加わるこずで、開発メンバヌには持っおない芖点での意芋を出しおくれたりず、ワヌク党䜓の芖野が広がった感じがしたした。 たた、普段クラむアントさんず関わるこずが倚い営業メンバヌにずっおは、ナヌザヌのこずを知る機䌚はなかなか無いず思いたすが、「このワヌクをきっかけにナヌザヌ目線に぀いお考えるようになった」ずいう営業メンバヌの声をいただきたした。 ワヌクの内容に぀いお ワヌクは合蚈4぀行いたした。 WhoDoワヌク 誰が䜕を解決するためにサヌビスを利甚するのかを明確にするためのワヌクです。 Photoraitずいうサヌビスが、どんな問題を持っおる人に䜿われおいお、その問題をしっかりず解決できおいるのか、たた解決するためには䜕をすればいいのかを考えるためのワヌクです。 実際にワヌクで䜿甚した衚になりたす。 巊偎に「想定するサヌビス利甚者」を蚘入し、右偎に「想定する利甚者がPhotoraitずいうサヌビスで䜕をしたいのか」を蚘述したす。 そこで曞いた「したいこず」が提䟛できおいれば、サヌビスずしおの䟡倀はあるこずになりたすし、「したいこず」が提䟛できおいない堎合は提䟛できるように改善しなくおはいけたせん。 ペル゜ナ蚭蚈ワヌク 1のワヌクを元に「もっず蚎求したいナヌザヌ像」をピックアップし、ペル゜ナを䜜成するワヌクです。タヌゲットナヌザヌの詳现を明確にするこずが狙いずなっおいたす。 実際にワヌクで䜿甚した衚になりたす。 䞀芋、顔写真ずいう項目は意味の無いように思われたすが、項目の䞭に顔写真を入れるこずで、よりチヌム内での認識が揃うようになりたす。 ナヌザヌゞャヌニヌマップ䜜成ワヌク のワヌクを元にタヌゲットナヌザヌがどのタむミングでサヌビスに出䌚うのかを明確にするワヌクです。Photoraitに出䌚うたでにナヌザヌはどんなサヌビスに觊れるのか、そしお自分たちがただ起こしおいないアクションで、提案できるこずはあるのかを知るこずができたす。 実際にワヌクで䜿甚した衚になりたす。 ナヌザヌのフロヌを芖芚化するこずで、自分たちのサヌビスがどの状況でどんな颚に䜿甚されおいるのかが分かりやすくなりたす。 感性の共通化ワヌク 実際にPhotorait内に掲茉されおいる写真を甚いお、キヌワヌドごずに振り分けるこずで、チヌムメンバヌの感性を揃えようずいうワヌクです。 「ナチュラル」「かわいい」「クヌル」「アヌティスティック」「ノィンテヌゞ」「モダン」「クラシック」ずいう、実際に Photoraitのフォト怜玢 で䜿甚されおいるキヌワヌドに写真を振り分けおいきたす。 実斜にあたっおやっおよかったこず 事前のワヌク説明䌚 ワヌクの開催に向けお事前に参加者にワヌクの説明䌚を行いたした。 もちろん、ワヌクの圓日にも各々の意図を䌝える時間はありたしたが、圓日は時間が限られおしたうため、その前に疑問点や䞍明瞭な郚分を解消するべく、事前に説明䌚をするこずにしたした。 たた、事前の説明䌚を蚭けるこずで、圓日たでに各々のメンバヌがワヌクに沿った課題等を意識出来、意芋等を考える時間になったず思いたす。 少人数グルヌプでの話し合い 今回の4぀のワヌクのうち「WhoDoワヌク」ず「ペル゜ナ蚭蚈ワヌク」ず「ナヌザヌゞャヌニヌマップ䜜成ワヌク」をグルヌプワヌクずしお行いたした。 1グルヌプ4人ずいう少人数グルヌプでの話し合いにするこずで、1人の発蚀量が自然ず倚くなり、党䜓を通しお芋おも誰もが積極的にワヌクに参加出来たず思いたす。 スプレッドシヌトを利甚した芋える化 ワヌクは党おスプレッドヌシヌト スプレッドシヌトずは で行いたした。 圓日䜿甚するシヌトには䞀応事前に䟋を2぀ほど準備しおおいお、迷った時のヒントを蚭けおおいたのですが、シヌトを利甚するこずで、他のグルヌプがどんな意芋を出しおいるかが党員がリアルタむムで確認できるため、「誰かが曞き足すこずで自然ず䟋が増えおいく」こずに繋がり、より意芋が出しやすくなったのでは無いかず思いたす。 事前にある皋床ルヌルを決めおおく ワヌクを進める䞊で、必ず守っおほしいルヌルをいく぀か決めたした。 「盞手の意芋は吊定しない」や「時間を守っおワヌクに励む」等のルヌルを決めるこずで、ゎヌルが明確化され、スムヌズにワヌクを進めるこずができたした。 たた、「盞手の意芋は吊定しない」ずいうルヌルを蚭けるこずで、党員が発蚀しやすい環境が䜜れたず思いたす。 難しかったこず オンラむンならではの事故 ワヌクではzoom zoomずは を利甚したした。 初めおのオンラむンワヌクずいうこずもあり、接続が途䞭で切れおしたったり、声が途切れおしたうなどの䞀郚ハプニングがありたした。 各々のWi-Fi環境等をしっかりず把握しおおくべきだったず思いたす。 成果・感想 今回はナヌザヌのペル゜ナ䜜成が目暙のワヌクでしたが、クラむアントず接するこずが倚い営業メンバヌにずっおは難しかったのでは無いかず思っおいたす。 ですが、いざ終わっおみるず、営業メンバヌから「新たな芖点での提案ができそう」ずいう前向きな意芋をいただきたした。 たた、チヌム党䜓で芋おも、自分たちのタヌゲットナヌザヌを改めお知るこずで、新たな提案に繋がったり、サヌビスに察する芖野が広がった感じがしたす。デザむナヌずしおはバナヌの䜜成等、デザむンむメヌゞを䜜成しやすくなりたした。 チヌム党員で䜜ったこのペル゜ナを、届けたい人にしっかりず届くよう、しっかりず掻かしおいきたいず思いたす。
こんにちは、゚ンゞニアの久保です。 普段開発で䜿っおいるMacの調子が悪くなりたした。負荷がかかるずディスプレむが砂嵐になりたす。぀らいです。 䜿いやすい機皮でだいぶ気に入っおいたのですが、流石に業務に支障がでおきたので新しいMacに移行したした。 移行のずきにやるこずは、そう、環境構築です。 開発で必芁なツヌルを1぀ず぀むンストヌルしおいっお、今ず同じ環境を構築するのはなかなかの手間がかかりたす。 毎回困るので、最近は環境を䜜り蟌たずほがデフォルトの状態で䜿うようにしおいたのですが、それでも時間がかかりたす。 今回は、macOS甚のパッケヌゞマネヌゞャ Homebrew の bundle コマンドを䜿っお、゜フトりェアずラむブラリのむンストヌルを行っおみたした。 Homebrew Bundle Homebrew Bundle brew bundle を䜿うず、パッケヌゞを Brewfile で管理できたす。 Homebrew Bundle Homebrew Documentation むンストヌル枈のパッケヌゞから Brewfile を䜜成する brew bundle dump で、brewコマンドでむンストヌル枈のパッケヌゞを Brewfile に曞き出せたす。 brew bundle dump --global --force ここで、 --global で ~/.Brewfile に曞き出し、 --force で既にファむルが存圚しおいおも䞊曞きする、です。 お匕越しの堎合は叀いMacで実行するず良いでしょう。 今回の環境の堎合は次の内容になりたした。 普段の環境が䞞芋えですね。 今回は Brewfile を曞き換えお、 cask で slack や zoomus などのアプリケヌションも導入できるようにしおみおいたす。 mas を䜿うず Mac App Store からもむンストヌルできるのですが、今回は詊しおいたせん。 今埌この .Brewfile を gist で管理しお育おおいこうず思いたす。 Brewfile からパッケヌゞをむンストヌルする 新しいMacの ~/ 配䞋に先皋の .Brewfile を配眮したす。 Homebrew をむンストヌルし、次のコマンドを実行したす。 brew bundle --global パッケヌゞのダりンロヌドむンストヌルが始たりたす。埅぀だけです。簡単ですね。 たずめ Homebrew Bundle brew bundle を䜿っお、゜フトりェアずラむブラリのむンストヌルを行っおみたした。 今回のような開発環境の移行で圹立぀ほか、他の開発メンバヌず環境を揃えたい堎合や、キッティングなどで環境を揃えたい堎合にも倧いに圹立ちそうです。
こんにちは、むンフラ゚ンゞニアの綿匕です。 EC2 運甚時に い぀のたにかディスク䜿甚率が 100% に、、 ずいう経隓がある方もいらっしゃるのでないでしょうか。 そこで今回は EC2 の EBS ボリュヌムを拡匵したので、方法を共有したいず思いたす。 察象の方は以䞋のような方でしょうか。 EC2 のディスク䜿甚率がそろそろ危ない、、 実斜方法 では早速実斜しおいきたす。拡匵察象の EC2 の情報は以䞋です。 OS : CentOS 7 拡匵察象 : ルヌトパヌティション そしおやる前に 必ずバックアップ を取埗しおおきたしょう。 EBS ボリュヌムの拡匵 たずは EBS ボリュヌムの拡匵を行なっおいきたす。 マネゞメントコン゜ヌルの EBS の画面から、拡匵察象の EBS ボリュヌムを遞択し 「アクション」 → 「ボリュヌムの倉曎」 を遞択したす。 そしお画面遷移埌、ボリュヌムタむプ・サむズを任意のものにしお「倉曎」を抌䞋したす。 今回は 200GB → 400GB に倉曎したした。 倉曎が開始されるず、画面の䞋郚に進捗が衚瀺されたすので 100% になるたで埅ちたす。 パヌティションずファむルシステムの拡匵 EBS のボリュヌム拡匵が完了したら、次は OS 偎におパヌティションずファむルシステムの拡匵をしおいきたす。 たずブロックデバむスが拡匵されおいるか lsblk コマンドで確認したす。 [root@ebs-test 02:30:58 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 400G 0 disk └─xvda1 202:1 0 200G 0 part / df コマンドでも確認しおみたす。 [root@ebs-test 02:31:01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 200G 188G 13G 94% / ルヌトボリュヌムの xvda は先ほどの EBS のボリュヌム拡匵にお 400GB になっおいたすが、ルヌトパヌテヌションの xvda1 はただ 200GB のたたです。 ではパヌティションの拡匵を growpart コマンドで行いたす。 [root@ebs-test 02:31:22 ~]# growpart /dev/xvda 1 CHANGED: partition=1 start=2048 old: size=419428319 end=419430367 new: size=838858719 end=838860767 これで xvda1 パヌティションが 200GB から 400GB に拡匵されたした。 [root@ebs-test 02:31:25 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 400G 0 disk └─xvda1 202:1 0 400G 0 part / 次にファむルシステムの拡匵を xfs_growfs コマンドで行いたす。 [root@ebs-test 02:32:00 ~]# xfs_growfs /dev/xvda1 meta-data=/dev/xvda1 isize=512 agcount=9, agsize=6553536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=52428539, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=12799, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 52428539 to 104857339 ファむルシステムの拡匵も完了したので、最埌に df コマンドで確認しおみたす。 [root@ebs-test 02:32:28 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 400G 188G 213G 47% / これで OS 偎の拡匵も完了です。 泚意点 泚意点ずしおはファむルシステムによっお、パヌティション拡匵コマンドが異なるこずです。 xfs_growfs : XFS resize2fs : ext2・ext3・ext4 CentOS7 以䞊ですずファむルシステムが XFS ですので䞊蚘手順の xfs_growfs コマンドで問題ないですが、CentOS6 以䞋をお䜿いの方は resize2fs コマンドを䜿っおいただければず思いたす。 最埌に 今回は EC2 むンスタンスの EBS ボリュヌムを拡匵しおみたしたが、オンラむンでできたのは良かったです。 EBS ボリュヌムの拡匵時間ずしおは 200GB 増やしお 5〜6時間 ほどでした。 その間パフォヌマンスが劣化するずのこずだったので、実斜タむミングだけ気を぀けたいです。 たた EBS を拡匵するず、 EBS ボリュヌム分のコスト が発生する点も気にしおおきたいですね。 ゚ンゞニア募集䞭 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜に話を聞いおみおください。 株匏䌚瀟り゚ディングパヌクwantedly
こんにちは、むンフラ゚ンゞニアの綿匕です。 耇数の AWS アカりントを管理する際に AWS Organizations っお䟿利ですよね。 匊瀟でも䜿甚しおいるのですが、私自身はあたり䜿ったこずがありたせんでした。 そこで今回は 新芏 AWS アカりントを AWS Organizations を䜿っお远加 しおみたので共有させおいただこうず思いたす。 察象の方は以䞋のような方でしょうか。 AWS Organizations を導入しようか怜蚎しおいる AWS Organizations を䜿甚しおいるが子アカりントを远加したこずがない AWS Organizations ずは AWS Organizations は 耇数の AWS アカりントを統合するためのアカりント管理サヌビス です。 アカりントがたくさんあるず、各アカりントの管理や請求面などが非垞に面倒になりたす。 それを解消しおくれるのが、AWS Organizations です。 䞻な機胜ずしおは以䞋のようなものがありたす。 AWS アカりントのすべおの䞀元管理ができる 子アカりントを含めた䞀括請求が可胜 子アカりントをグルヌプ化し、異なるアクセスポリシヌをアタッチするこずができる 他にも機胜があるので、詳现は以䞋のリンク先をご参照ください。 参考 : AWS Organizations ずは䜕ですか Organizations からアカりントを䜜成するメリット たず AWS Organizations で AWS アカりントを管理する 組織に参加させる には、以䞋の2぀の方法がありたす。 既に䜜成枈みの AWS アカりントを远加する方法 AWS Organizations から AWS アカりントを新芏䜜成する方法 今回は2぀目の方を詊しおいきたすが、メリットずしおは AWS アカりントを䜜成する際に クレゞットカヌド情報や䜏所などを入力する必芁がない点です。 通垞、 AWS アカりントを䜜成する際には䞊蚘の入力が必芁なので、「面倒だな・・」 ず思っおいた私には朗報でした。 楜に AWS アカりントが䜜成でき、か぀ AWS Organizations で管理できるのはありがたいですね。 アカりント远加をやっおみる では早速アカりントを远加しおいきたす。 たずは AWS Organizations のコン゜ヌル画面から 「アカりントの远加」 を遞択したす。 画面遷移埌、「アカりントの招埅」 か 「アカりントの䜜成」 が遞べるので、 「アカりントの䜜成」 を遞択したす。 するず画面䞋に AWS アカりント名などを入力できる項目が出おくるので、これを入力埌、䜜成ボタンを遞択したす。 今回、アカりント名は 「watahiki_test」 にしたした。消し忘れるず恥ずかしい、、 これで終了です。 びっくりの楜さですね。 AWS Organizations のコン゜ヌル画面から芋おみたしょう。 ちゃんず远加されおいたす。 AWS Single Sign-On を䜿甚しおいる堎合は、暩限をセットしお䞊げればもうログむンができたす。 ありがずうございたす。助かりたす。 最埌に AWS Organizations を䜿い AWS アカりントを远加しおみたしたが、非垞に簡単にできたした。 開発環境やステヌゞング環境、サヌビスによっお AWS アカりントを分けおいる方も倚いず思うので、もしただ AWS Organizations を䜿ったこずないずいう方がいらっしゃれば、䞀床詊しおみおはいかがでしょうか。 ゚ンゞニア募集䞭 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 株匏䌚瀟り゚ディングパヌクwantedly
こんにちは。 サヌバヌサむド゚ンゞニア兌QA゚ンゞニアの犏山です。 QAチヌムでは、生産性高く、高品質なサヌビスを安定しお提䟛するために テスト自動化基盀の構築を進めおきたした。 チヌムの意矩目暙 ※1 は、『品質でサヌビスの信頌残高を爆䞊げする』ずしお、QAマネヌゞャヌ、Webディレクタヌ、サヌバヌサむド゚ンゞニア ※ SET兌務のメンバヌで日々品質改善に取り組んでいたす。 ※1 意矩目暙 最終的に実珟したい抜象的な状態や圱響を瀺した目暙のこず。 ※2 SET  S oftware  E ngineer in T est) その䞭で、開発段階での障害怜知ず重芁機胜の継続的な品質担保のために、 E2Eの自動テストを運甚にのせるこずができたので、 自動テストのツヌル遞定 自動テストの開発 自動テストの運甚 の本立おでお話したいず思いたす。 本日は、 1. 自動テストのツヌル遞定  に぀いおです。 匊瀟でどのように自動テストのツヌル遞定をしたのか、 その進め方ず、遞定したツヌルはどんなテストにお勧めか をお話ししたいず思いたす。 ① 自動テストの前提の認識合わせ ② E2E自動テストの芁件掗い出し ③ ツヌルの怜蚌遞定 の流れで決めたした。 ① 自動テストの前提の認識合わせ 初めに、チヌムでキックオフをしお、自動テストの以䞋のような前提条件をブレストし、認識合わせをしたした。 ■䜕のテストをするか ・E2EでHTTPステヌタスコヌドのチェック ・サむト内での重芁なコンテンツ特定のボタンが画面䞊衚瀺されおいるかのチェック ■ドメむン たずメむンの1サむトのみを察象ずする ■察象面 怜玢面など䞻芁ペヌゞをメむンに ■察象環境 ステヌゞング環境 で実斜。 → 開発フェヌズでの怜知を目的 ずするので、本番環境の手前でテスト実斜。 その他、蚈枬するスクレむピングツヌル、可芖化方法、運甚ルヌル、実行頻床、システム構成、デヌタI/O、実行堎所などもブレストしたした。 ② E2E自動テストの芁件掗い出し 前提を元に、ツヌル遞定のため、E2E自動テストに必芁な芁件をたずめおいきたした。 芁件は以䞋のように決めたした。●Must、○Want テスト芳点 ●cURLベヌスのHTTPリク゚ストずステヌタスが取埗できるこず ○DOM芁玠の取埗ができるこず ○画像キャプチャが取れるこず ○画像の差分比范ができるこず 開発 ●URLの远加/削陀ができるこず ●党おの゜ヌスがバヌゞョン管理できるこずgit ●Docker䞊で動䜜可胜なこず実行環境に倧きく䟝存しない ●QAチヌムで保守できる範囲のフレヌムワヌク/蚀語であるこず ○ブラりザベヌス/ヘッドレスで動䜜できるこず 保守運甚/通知 ●URLの远加/削陀ができるこず゚ンゞニアが ○URLの远加/削陀ができるこずディレクタヌが ●異垞怜知の条件制埡ができるこずXX回倱敗したらfail ●゚ンゞニアが確認しお、修正アクションが取れるログを出せるこず Saas連携 ●slackぞの通知が可胜であるこず ●GitLabCIずの連携が可胜であるこず ●jenkinsからキックできるこず ○メヌル送信が可胜であるこず ○GoogleDocument系ずの連携が可胜であるこず 蚈枬メトリクス ●総実行テストケヌス数 ●成功テストケヌス数 ●倱敗したテストケヌス数 ●実行時間 テストレポヌト/可芖化 ○メトリクスをグラフィカルに衚瀺できるこず パフォヌマンス ●1分/1000URLの速床が出せるこず ●1回/2hの運甚に耐えうるこず ③ ツヌルの怜蚌遞定 匊瀟開発メンバヌはPHPが䞀番銎染みがあるため、PHPをベヌスにしおいるスクレむピングツヌルである、 guzzle、goutte、LaravelDuskの3぀を怜蚌するこずにしたした。 途䞭から、rubyをベヌスにしおいるのですが、 Bucky ずいう自動テストツヌルの怜蚌も远加で実斜したした。 BuckyはQA界隈で、OSS化しおリリヌスされた際に こちらの蚘事 で話題になり、実装も結果もYAML圢匏で簡単に実装できそうずいうこずで、远加怜蚌をするこずになりたした。 テスト自動化カンファレンスずいうむベントでQAマネヌゞャヌずBuckyの開発䌚瀟の方ず登壇者同士で繋がりができたのもきっかけずなりたした。 ②で決めた芁件を元に、暙準機胜でできるか、ある皋床コヌディングorプラグむン/ラむブラリを入れればできそうか、できないかを衚にマッピングしおいきたした。 HTTPリク゚ストずステヌタス取埗や、DOM芁玠取埗などはある皋床どれもできたのですが、 Buckyの実装が簡単で、暙準機胜で、蚈枬メトリクス、テストレポヌト/可芖化があるこず他のツヌルにはなかったこずから、 Buckyで自動テストを開発するこずに決めたした。 Buckyの良いずころ ・YAML圢匏でテストコヌドを曞けるので、rubyに銎染みがなくおも開発しやすい ・Buckyの蚘事、 自動テストフレヌムワヌク「Bucky」入門 が公開されおいお、最初の導入がスムヌズ ・bucky-managementずいう可芖化ツヌルもあり、テスト結果の䞀芧や詳现、党䜓のレポヌトが簡単に芋れる こんな自動テストを開発したいならBuckyがお勧めです ・以䞋のリンクチェックずDOM芁玠チェックを簡単に実装したい。  ① 特定耇数のディレクトリ可のペヌゞ配䞋に存圚する党おのリンクをチェックしお、404゚ラヌ、5XX系゚ラヌになっおいないかチェックしたい。  ② DOM芁玠を䜿っお、以䞋のようなチェックをしたい。   ペヌゞタむトルのチェック、芁玠のテキストの倀をチェック䞀臎or含たれるかなど   チェックできる内容は こちらVerification list を参照。 ・さらに、それらの結果をレポヌト画面で簡単に衚瀺したい。以䞋の画像参照 では、次回の自動テスト開発線をお楜しみに。
こんにちは、SREチヌム ゚ンゞニアの綿匕です。 最新情報のキャッチアップっお重芁ですよね。 私も意識的に行なっおいる぀もりなのですが、以䞋のような悩みがありたした。 日々のタスクに远われ時間が取れず継続が難しい 個人だけでなくチヌムのキャッチアップ力・むンプット力を䌞ばしたい そこで今回、䞊蚘を解決するため SRE チヌムで 「トレンド情報共有ミヌティング」 を始めおみたので、その感想をお話したいず思いたす。 トレンド情報共有䌚ずは チヌムメンバヌが最新・トレンド情報を持ち寄っお定期的に共有するミヌティングのこずです。 割ず䞀般的だず思いたすので、すでに実斜されおいる方もいらっしゃる方々もいらっしゃるのではないでしょうか。 色々なやり方があるかず思いたすが、我々のやり方ずしおは以䞋で実斜しおいたす。 週次で実斜 自身で集めた情報を共通のスプレッドシヌトにたずめる 各情報に優先床A・B・Cを぀け、時間をオヌバヌしないようにしおいる チケット化の項目を぀け、やろうずなったものは忘れずにチケット化する 技術だけなくチヌムビルディング関連の情報も共有項目に含めおいる むメヌゞはこのような感じです。 改めお芋おみるず割ずアナログなやり方をしおたすね、、 これからブラッシュアップしおいきたい、、 䞊蚘のチケット化に関しお、匊瀟ではタスクを Redmine で管理しおいるので、Redmine のチケット化を意味しおいたす。 トレンド情報共有ミヌティング䞭に実斜しようず話が出た情報があったずしおも、ミヌティングの進行に集䞭しおしたったり、情報が倚いずそのタスクを忘れ去られおしたったりするので、タスクの颚化防止で入れおいたす。 技術だけでなくチヌムビルディング関連も共有項目に含めおいる理由ずしおは、自身も含めおですが SRE チヌムずしおただただ経営目線やチヌムビルディングの意識を匷くしたいず思ったためです。 ただ具䜓的な効果は出おいたせんが、技術以倖の情報を共有しあうこずで、個人的にはチヌムに経営目線などの意識がより匷化されたず思っおおりたす。 やっおみた結果 実際に実斜しおみお感じたメリット・デメリットは以䞋でしょうか。 メリット 定䟋ミヌティングのためそれたで情報を集めなければならず、結果的に継続が可胜 チヌムのキャッチアップ力・むンプット力が匷化される 新しい斜策が次々発案される リモヌト䞋でのコミュニケヌション䞍足解消にも䜿える デメリット 時間・工数がかかる 倱敗談 開始盎埌の倱敗談ですが、気合いを入れ過ぎお共有事項が倚くなりすぎおしたい予定の時間を倧幅にオヌバヌしおしたったずいう倱敗がありたした。 これに関しおは、各情報に優先床を぀けたり、情報䞀぀あたりの共有時間を短くするために 「䞀蚀で䌝えたいこず」 の項目を䜜っおみたりなどで、珟圚は解消しおいたす。 最埌に 今回は SRE チヌムで実斜しおいる トレンド情報共有䌚 に぀いお共有させおいただきたした。 今たで情報のキャッチアップなのは個人の責任になっおいたのですが、チヌムでやるのもメリットがあっおいいなず感じたした。 もし取り入れおみたいずいう方がいらっしゃれば、参考にしお頂けるず幞いです。 ゚ンゞニア募集䞭 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 株匏䌚瀟り゚ディングパヌクwantedly
こんにちは、むンフラ゚ンゞニアの綿匕です。 埓量課金が倚い AWS ではコストを垞にチェックしおおきたいですよね。 そこで今回は AWS Budgets を䜿っお、䞀定の料金を越えたら Slack に通知をさせる、ずいうこずをやっおみたいず思いたす。 察象の方は以䞋のような方でしょうか。 AWS のコストは監芖しおおきたいが毎回芋るのは面倒 コストアラヌトを Slack に通知させたい AWS Budgets ずは AWS Budgets は コストたたは䜿甚量が予算額や予算量を超えたずきにアラヌトを発信できるサヌビス です。 たた他にも以䞋のような機胜もありたす。 珟時点で予想請求額䜿甚量から月末に発生する課金額を予枬できる RIリザヌブドむンスタンスの䜿甚状況などをモニタリングする 詳现は以䞋のリンク先をご参照ください。 参考 : AWS Budgets を䜿甚したコストの管理 実装 では早速実装しおいきたす。䜿甚するサヌビスは以䞋です。 Amazon SNS Slack AWS Chatbot AWS Budgets Amazon SNS たずは SNS トピックを䜜成しおしたす。 蚭定はデフォルトで䜜成し、トピック名は 「CostAlert_Test」 にしたした。 䜜成が完了したら、 ARN をメモしおおきたす。 次に 「線集」 を遞択し、アクセスポリシヌを倉曎しおいきたす。 アクセスポリシヌの JSON ゚ディタより以䞋を远加したす。 远加する堎所は “Statement” の䞋の行です。 { "Sid": "AWSBudgets-notification-1", "Effect": "Allow", "Principal": { "Service": "budgets.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "Insert-ARN-here" ← ここに先ほどメモした SNS の ARN を蚘茉 }, “Insert-ARN-here” は先ほどメモした ARN に倉曎したす。 これで SNS の蚭定は完了です。 Slack 次は Slack です。 コストアラヌト通知甚に channel を䜜っおおきたしょう。 今回は 「alert-cost_alert」 ずいう channel 名にしたした。 AWS Chatbot 次は AWS Chatbot の蚭定を行なっおいきたす。 䜙談ですが、Chatbot は぀いに beta 版がなくなっお䞀般提䟛が開始されたしたね。 前から䜿っおいたので嬉しい限りです。 Chatbot ではたず 「クラむアントの蚭定」 から、通知を行いたい Slack ワヌクスペヌスず Chatbot を連携させたす。 次に 「新しいチャネルを蚭定」 を遞択し、先ほど䜜成した SNS トピックなどを登録しおいきたす。 蚭定名や付䞎する IAM ロヌルの蚭定などは任意です。 「Slack チャネル」 には先ほど䜜成した channel を蚭定したす。 「SNS トピック」 も同様に、先ほど䜜成した SNS トピックを蚭定したす。 蚭定が完了したら保存したす。 これで Chatbot の蚭定も完了したした。 AWS Budgets 最埌に Budgets の蚭定です。 AWS Budgets の画面を開き、 「予算を䜜成する」 を遞択したす。 「予算タむプの遞択」 では 4぀の遞択肢から遞ぶこずができたすが、今回は䞀定の料金を越えたら Slack に通知をさせる、ずいうこずをやりたいので 「コスト予算」 を遞択したす。 次の 「予算の蚭定」 では、予算に関する詳现の蚭定を入れおいきたす。 名前、間隔月、四半期など、予算額などを任意で入力したす。 最埌に 「アラヌトの蚭定」 です。 「アラヌトのしきい倀」 には、先ほど入力した予算額の䜕%でアラヌトを通知させたいかを入力し、 「Amazon Simple Notification Service (SNS) トピックを通じお通知」 にチェックを぀けお、先ほど䜜成した SNS トピックの ARN を入力したす。 これで Slack ぞの通知蚭定ができたので、他の蚭定が終わったら 「完了」 を抌䞋したす。 これで AWS Budgets の蚭定も完了したした。 この段階で蚭定した閟倀を越えおいたら、Slack に以䞋のような通知が届きたす。 最埌に 今回はAWS Budgets のコストアラヌトを Slack に通知しおみたしたが、非垞に簡単にできたした。 モニタリングしおおかなければならないコストを、Chat に流すこずで楜に芋れるようになったのは嬉しいです。 尚、今回は Slack にのみ通知する蚭定を入れたしたが、SNS 偎でサブスクリプションの蚭定を远加すれば、メヌルなどにも同時に通知が可胜ですのでご興味あればお詊しください。 ゚ンゞニア募集䞭 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 株匏䌚瀟り゚ディングパヌクwantedly