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
190
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
タグバンガーズのDevOpsと CWL-Jiraログ連携について
2019.5.20 JAWS-UG Yokohama発表 タグバンガーズ 佐々木
Alisa Sasaki
May 21, 2019
Other Decks in Technology
See All in Technology
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
1
240
サイバー捜査員研修(後半)
nomizone
1
850
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
190
攻撃と防御で学ぶAI時代のプロダクトセキュリティ演習
recruitengineers
PRO
9
2.6k
【AG-UI × A2UI × MCP Apps】Generative UIをやさしく解説する
nrinetcom
PRO
1
110
猫付きpingコマンドを自作
uyuki234
0
210
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
2
220
私がブラウザを自作したくなった理由
supurazako
1
170
FDEの心得
noriakioji
3
3.7k
TypeScript入門 2026
recruitengineers
PRO
3
550
OSPN.JPバージョンアップ作業進捗のご報告 / 20260801-osc26kyoto
akkiesoft
0
470
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
110
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.3k
Being A Developer After 40
akosma
91
590k
Site-Speed That Sticks
csswizardry
13
1.4k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
650
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
250
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
YesSQL, Process and Tooling at Scale
rocio
174
15k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Navigating Team Friction
lara
192
16k
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リソース設定 • 失敗時もキューにイベントを貯めるようにする
ご静聴ありがとうございました。