Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
タグバンガーズのDevOpsと CWL-Jiraログ連携について
Search
Alisa Sasaki
May 21, 2019
Technology
0
160
タグバンガーズのDevOpsと CWL-Jiraログ連携について
2019.5.20 JAWS-UG Yokohama発表 タグバンガーズ 佐々木
Alisa Sasaki
May 21, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
AIとともに歩んでいくデザイナーの役割の変化
lycorptech_jp
PRO
0
750
会社を支える Pythonという言語戦略 ~なぜPythonを主要言語にしているのか?~
curekoshimizu
1
230
もう外には出ない。より快適なフルリモート環境を目指して
mottyzzz
7
3.2k
AI-Readyを目指した非構造化データのメダリオンアーキテクチャ
r_miura
1
260
ローカルLLMとLINE Botの組み合わせ その2(EVO-X2でgpt-oss-120bを利用) / LINE DC Generative AI Meetup #7
you
PRO
0
130
「改善」ってこれでいいんだっけ?
ukigmo_hiro
0
390
LLMプロダクトの信頼性を上げるには?LLM Observabilityによる、対話型音声AIアプリケーションの安定運用
ivry_presentationmaterials
0
740
AI時代におけるデータの重要性 ~データマネジメントの第一歩~
ryoichi_ota
0
710
物体検出モデルでシイタケの収穫時期を自動判定してみた。 #devio2025
lamaglama39
0
260
RDS の負荷が高い場合に AWS で取りうる具体策 N 連発/a-series-of-specific-countermeasures-available-on-aws-when-rds-is-under-high-load
emiki
7
4.4k
Zephyr(RTOS)にEdge AIを組み込んでみた話
iotengineer22
1
230
それでも私が品質保証プロセスを作り続ける理由 #テストラジオ / Why I still continue to create QA process
pineapplecandy
0
150
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
The Illustrated Children's Guide to Kubernetes
chrisshort
49
51k
Music & Morning Musume
bryan
46
6.9k
Done Done
chrislema
185
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
630
Building an army of robots
kneath
306
46k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
Embracing the Ebb and Flow
colly
88
4.9k
Gamification - CAS2011
davidbonilla
81
5.5k
Being A Developer After 40
akosma
91
590k
Transcript
タグバンガーズのDevOpsと CWL-Jiraログ連携について タグバンガーズ 佐々⽊ 2019.5.20
⾃⼰紹介 • 株式会社タグバンガーズからきました • JSUG(Spring), JAWS-UG Yokohamaスタッフ(NEW!) • 好きなAWSのサービス:Beanstalk •
好きなAtlassianのサービス:Confluence Atlassian アトラシアン製品導⼊⽀援 AWS AWS導⼊⽀援・構築 Web/Smartphone App モダンな業務システム開発
タグバンガーズのDevOps DEV OPS 提案書 仕様書 リリースノート スプリントで開発、タスク管理 gitリポジトリ ビルドツール デプロイツール
顧客サポート受付・対応 チャットツール コードクオリティ分析 Atlassian のサービスを利⽤したチケット駆動のプロジェクト管理
タスクが発⽣したらJiraからBitbucketに対してブランチを作成 タスク管理ツール リポジトリ
BitbucketのPRでタスクのコミット内容やビルド結果を確認 AWS CodeCommit is like リポジトリ
Bambooでビルド・デプロイのステップを指定 AWS CodeDeploy AWS CodeBuild AWS CodePipeline is like Bamboo:ブランチベース
Bitbucket Pipeline:PRベース ビルド・デプロイ
Bambooでビルド・デプロイのステップを指定
None
成果物を顧客のAWS環境にデプロイ Beanstalk デプロイ EC2 Beanstalk Beanstalk AWS Cloud AWS Cloud
AWS Cloud AWS Cloud クライアント クライアント クライアント push
CWL + Jira でシステムのログ連携機能を作りました フィルター条件に⼀致した怪しいログをニアリアルタイムに JIRAへチケット化するための仕組み
AWS Cloud ログを監視し、Exceptionが発⽣したときにJiraにタスクを⾃動⽣成する AWS Cloud クライアント Log publishers Amazon Kinesis
Data Stream Amazon DynamoDB Amazon CloudWatch Logs AWS Key Management Service AWS Cloud Subscription Filter(メトリク スフィルタ) バッファリング+ 複数アカウント連携 Subscription Decrypted Credentials REST API GET Jira Project ID CloudWatch Logsのロググループと 対応するJIRAプロジェクトの マッピングを保持する Log publishers AWS Lambda EC2 Subscription Filter Jiraのログイン情報をもって プロジェクトに対し チケットを作成する Amazon CloudWatch Logs 5SJHHFS ϩάͷऩूͱӾཡͷ ϑΟϧλϦϯά͞ΕͨϩάΛ νέοτ͢Δ
使⽤したツール • packaging, deploy: AWS SAM • CWLでサブスクリプションフィルタに⼀致したレコードを受信する Kinesis Data
Stream • CWLがKinesis Data Streamへ送信するときに利⽤するIAM Role • KinesisをポーリングしてJiraへチケットを作成するラムダファンク ション • Jira エンドポイント/ユーザ名/パスワード • CWL LogGroup と Jira のプロジェクトとの相関情報を保持する DynamoDB • Lambda: GoLang
CWLDestination: Type: AWS::Logs::Destination Properties: DestinationName: go-notify-logs-central-destination DestinationPolicy: > { "Version"
: "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "AWS" : [ ”123456789012", ”123451234512" ] }, "Action" : "logs:PutSubscriptionFilter", "Resource" : "arn:aws:logs:*:*:destination:go-notify-logs-central-destination" } ] } RoleArn: !GetAtt CWLStreamRole.Arn TargetArn: !GetAtt CWLStream.Arn CWLがKinesis Data Streamへ送信するときに利⽤するIAM CWLでサブスクリプションフィルタに⼀致したレコードを受信するkinesis data stream CloudWatchLogs Destinationを作成 AWS SAMで定義しデプロイ template.yaml
Destinationのポリシーを修正して連携アカウント追加 CWLDestination: Type: AWS::Logs::Destination Properties: DestinationName: go-notify-logs-central-destination DestinationPolicy: > {
"Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "AWS" : [ ”123456789012", "123451234512”, "111122223333” ] }, "Action" : "logs:PutSubscriptionFilter", "Resource" : "arn:aws:logs:*:*:destination:notify-logs-destination" } ] } RoleArn: !GetAtt CWLStreamRole.Arn TargetArn: !GetAtt CWLStream.Arn アカウントのIDを信頼してクロスアカウントからの配信を可能にする 信頼するアカウントを追加するときはここにIDを追加してSAMを再度デプロイ
配信元AWSアカウントのCWLにサブスクリプションフィルターを設置 CloudWatchLogs LogGroupが既に存在する場合 locals { # SAMで作成されたDestination ARN destination_arn =
"arn:aws:logs:ap-northeast-1:*****:destination:notify-logs-destination" } module "main" { source = "../../modules/subfilter" log_group_name = “/aws/elasticbeanstalk/blog-tagbangers- product/var/log/tomcat8/catalina.out" filter_pattern = "Exception" destination_arn = "${local.destination_arn}" } Terraform
配信元AWSアカウントのCWLにサブスクリプションフィルターを設置 CloudWatchLogs LogGroupをフィルタと⼀緒に作る場合 locals { # SAMで作成されたDestination ARN destination_arn =
"arn:aws:logs:ap-northeast-1:****:destination:notify-logs-destination" } module ”test" { source = "../../modules/cwl_with_subfilter" name = "test" filter_pattern = "Exception" destination_arn = "${local.destination_arn}" }
Jira Metadataの管理 CWLLogGroup String: /aws/elasticbeanstalk/blog-tagbangers-product-alb/var/log/web-1.log JIRAAssigner String: ***@tagbangers.co.jp JIRAIssueType String:
Task JIRAPriority String: Major JIRAProjectKey String: SAP JIRAReporter String: ***@tagbangers.co.jp JIRASubject String: Exception from blog-tagbangers-product /aws/elasticbeanstalk/blog-tagbangers- product-alb/var/log/web-1.log Owner String: 153840059389 CloudWatchLogsのロググループとJIRAプロジェクトの関連はDynamoDBで管理 DynamoDB Item
Lambda Function Handler 抜粋 func handler(ctx context.Context, kinesisEvent events.KinesisEvent) error
{ if err := setup(); err != nil { return err } fmt.Printf("kinesisEvent = %#v\n", kinesisEvent) for _, record := range kinesisEvent.Records { kinesisData, err := tbaws.DecodeKinesisData(record.Kinesis.Data) fmt.Printf("kinesis decoded data = %#v\n", kinesisData) jiraMetadata, err := tbaws.GetJiraMetadata(kinesisData.LogGroup) for _, event := range kinesisData.LogEvents { res, err := jira.CreateIssue(&tbjira.CreateIssueRequest{ ProjectKey: jiraMetadata.JIRAProjectKey, Description: event.Message, Summary: "TestTask by Lambda", Issuetype: jiraMetadata.JIRAIssueType, Assigner: jiraMetadata.JIRAAssigner, Reporter: jiraMetadata.JIRAReporter, }) fmt.Printf("created jira issue = %#v\n", res) } } return nil }
作成された課題
TODO • EBクローンするたびに環境名subscription filterの設定する必要がある • ロググループは共通のものを作って、ログストリームを環境名 + InstanceIDにする • Jira
サーバが落ちると何もできない • スケールさせてHA構成にする(LB+Jira DC) • DLQリソース設定 • 失敗時もキューにイベントを貯めるようにする
ご静聴ありがとうございました。