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
コミュニティと計画的偶発性理論 - 出会いが人生を変える / Life-Changing Encounters
soudai
PRO
7
1.3k
生成AI利用プログラミング:誰でもプログラムが書けると 世の中どうなる?/opencampus202508
okana2ki
0
190
新卒(ほぼ)専業Kagglerという選択肢
nocchi1
1
1.9k
Understanding Go GC #coefl_go_jp
bengo4com
0
1.1k
ECS モニタリング手法大整理
yendoooo
1
120
いま、あらためて考えてみるアカウント管理 with IaC / Account management with IaC
kohbis
2
680
帳票Vibe Coding
terurou
0
130
マイクロモビリティシェアサービスを支える プラットフォームアーキテクチャ
grimoh
1
190
AIドリブンのソフトウェア開発 - うまいやり方とまずいやり方
okdt
PRO
9
550
S3のライフサイクル設計でハマったポイント
mkumada
0
140
我々は雰囲気で仕事をしている / How can we do vibe coding as well
naospon
2
210
DeNA での思い出 / Memories at DeNA
orgachem
PRO
2
990
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.5k
Faster Mobile Websites
deanohume
309
31k
What's in a price? How to price your products and services
michaelherold
246
12k
How to Ace a Technical Interview
jacobian
279
23k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Rails Girls Zürich Keynote
gr2m
95
14k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Building Applications with DynamoDB
mza
96
6.6k
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リソース設定 • 失敗時もキューにイベントを貯めるようにする
ご静聴ありがとうございました。