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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Alisa Sasaki
May 21, 2019
Technology
0
170
タグバンガーズのDevOpsと CWL-Jiraログ連携について
2019.5.20 JAWS-UG Yokohama発表 タグバンガーズ 佐々木
Alisa Sasaki
May 21, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
OSSで構築するIT基盤管理実践事例: NetBox・Snipe-IT・FreeRADIUS+PrivacyIDEA / Practical Case Studies of IT Infrastructure Management Using OSS
nttcom
0
200
Kiro のクレジットを使い切る!
otanikohei2023
0
110
問い合わせ自動化の技術的挑戦
recruitengineers
PRO
2
150
Digitization部 紹介資料
sansan33
PRO
1
7k
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
5
1.1k
製造業ドメインにおける LLMプロダクト構築: 複雑な文脈へのアプローチ
caddi_eng
1
450
Datadog Cloud Cost Management で実現するFinOps
taiponrock
PRO
0
140
EMからICへ、二周目人材としてAI全振りのプロダクト開発で見つけた武器
yug1224
3
400
Ultra Ethernet (UEC) v1.0 仕様概説
markunet
3
200
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
22k
AIに視覚を与えモバイルアプリケーション開発をより円滑に行う
lycorptech_jp
PRO
1
790
ソフトウェアアーキテクトのための意思決定術: Create Decision Readiness—The Real Skill Behind Architectural Decision
snoozer05
PRO
30
9k
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
710
Technical Leadership for Architectural Decision Making
baasie
3
270
Raft: Consensus for Rubyists
vanstee
141
7.3k
Marketing to machines
jonoalderson
1
5k
How STYLIGHT went responsive
nonsquared
100
6k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
490
[SF Ruby Conf 2025] Rails X
palkan
2
810
Are puppies a ranking factor?
jonoalderson
1
3.1k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.1k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
93
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
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リソース設定 • 失敗時もキューにイベントを貯めるようにする
ご静聴ありがとうございました。