Backlog GitでSnykスキャンを自動実行してSlackに通知してみた

Backlog GitでSnykスキャンを自動実行してSlackに通知してみた

2025.10.29

ゲームソリューション部の えがわ です。

本日はSnykのセキュリティスキャンをBacklogのGit(以下Backlog Git)のリポジトリに対して実行してみます。

背景

Snykはコードの脆弱性を検出するためのツールですが、BacklogのGitリポジトリに対しては以下のような課題があります。

  • Backlog GitはSnykの公式インテグレーションに対応していない
  • Backlog GitにはCI/CDの機能が備わっていない

そこで今回は、BacklogのWebhook機能を利用して、AWSでSnykスキャンを自動実行する仕組みを構築します。
ついでにスキャン結果をSlackに通知してみます。

構成図

backlog_git_snyk_cicd_09.png

BacklogからのWebhookを受け取り、API Gateway -> Lambda -> CodeBuildの流れでSnykスキャンを実行します。
API GatewayにはBacklogからのIPリストを設定し制限しています。

また、CodeBuildの完了後はEventBridge -> Lambda -> SNS -> Amazon Q Developer -> Slackの流れでスキャン結果の通知も行います。

リポジトリ

構築に使用したTerraformコードは以下のリポジトリで公開しています。

https://github.com/egawa-takeki/backlog-snyk-scan

対応手順

SSHキーの作成

CodeBuildがBacklog GitリポジトリにアクセスするためのSSHキーを作成します。

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_backlog -N "" 

公開鍵を確認します。

cat ~/.ssh/id_rsa_backlog.pub 

BacklogにSSHキーを登録

Backlogの個人設定から「公開鍵」を選択し、作成した公開鍵を登録します。

backlog_git_snyk_cicd_01.png

Terraformの設定

terraform.tfvars.exampleファイルをコピーしてterraform.tfvarsを作成し、環境に合わせて設定します。

cp terraform.tfvars.example terraform.tfvars 

GitリポジトリのURLとSnykの組織IDを設定する必要があります。

git_repo_urlにはBacklog GitリポジトリのSSH URLを指定します。

backlog_git_snyk_cicd_03.png

snyk_org_idにはSnykの組織IDを設定します。
組織IDはSnykのウェブダッシュボードで確認できます。

backlog_git_snyk_cicd_05.png

Terraformの適用

terraform init terraform plan terraform apply 

実行が完了すると、通知の実装方法及びWebhook URLが出力しています。

amazon_q_developer_setup_details = { "console_url" = "https://console.aws.amazon.com/chatbot/" "recommended_iam_role" = "ReadOnlyAccess" "region" = "us-east-1" "sns_topic_arn" = "arn:aws:sns:us-east-1:your-aws-account:backlog-snyk-cicd-snyk-notifications" "test_command" = "aws codebuild start-build --project-name backlog-snyk-cicd-snyk-scan" } api_gateway_id = "xxxxxxxxx" codebuild_project_name = "backlog-snyk-cicd-snyk-scan" eventbridge_rule_name = "backlog-snyk-cicd-codebuild-completion" lambda_function_name = "backlog-snyk-cicd-webhook-handler" notification_lambda_function_name = "backlog-snyk-cicd-notification-handler" s3_bucket_name = "backlog-snyk-cicd-codebuild-artifacts-xxxxxxxxx" setup_instructions = <<EOT 1. Update Snyk API token: aws ssm put-parameter --name "/backlog-snyk-cicd/snyk-api-token" --value "YOUR_SNYK_TOKEN" --type SecureString --overwrite 2. Update Backlog Git SSH private key: aws ssm put-parameter --name "/backlog-snyk-cicd/backlog-git-ssh-key" --value "$(cat ~/.ssh/id_rsa_backlog)" --type SecureString --overwrite 3. Configure Backlog webhook: URL: https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/webhook Method: POST Event: Push 4. Configure Amazon Q Developer for Slack notifications: a. Open Amazon Q Developer console: https://console.aws.amazon.com/chatbot/ b. Click "Configure new client" → Select "Slack" c. Authorize your Slack workspace d. Create a channel configuration: - Channel name: Select your Slack channel - IAM Role: Create a new role or use existing (ReadOnlyAccess recommended) - SNS Topics: Add arn:aws:sns:us-east-1:your-aws-account:backlog-snyk-cicd-snyk-notifications - Region: us-east-1 e. Save the configuration f. Test by running: aws codebuild start-build --project-name backlog-snyk-cicd-snyk-scan EOT sns_topic_arn = "arn:aws:sns:us-east-1:your-aws-account:backlog-snyk-cicd-snyk-notifications" snyk_token_parameter_name = "/backlog-snyk-cicd/snyk-api-token" webhook_url = "https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/webhook" 

SSMパラメータストアへの登録

Terraformの実行後、SnykトークンとSSH秘密鍵をSSM Parameter Storeに登録します。

Snykトークンの登録

Snykのアカウント設定からAPIトークンを取得し、SSMに登録します。

backlog_git_snyk_cicd_06.png

マネジメントコンソールから設定してもよいですが、

backlog_git_snyk_cicd_02.png

以下でも設定できます。

aws ssm put-parameter \ --name "/backlog-snyk-cicd/snyk-api-token" \ --value "your-snyk-token" \ --type "SecureString" \ --overwrite 

SSH秘密鍵の登録

aws ssm put-parameter \ --name "/backlog-snyk-cicd/backlog-git-ssh-key" \ --value "$(cat ~/.ssh/id_rsa_backlog)" \ --type "SecureString" \ --overwrite 

Amazon Q Developer in chat applicationsの設定

Slackにメッセージ送信を行うため、Amazon Q Developer in chat applicationsを設定します。

backlog_git_snyk_cicd_11.png

AWSコンソールのAmazon Q Developer in chat applicationsページにアクセスし、Slackワークスペースを認証して設定を行います。

backlog_git_snyk_cicd_07.png

backlog_git_snyk_cicd_08.png

Slackの設定

Slackに通知を行うため、通知先のチャンネルにAmazon Qアプリケーションを追加します。

Slackのアプリ一覧からAmazon Qを検索し、

backlog_git_snyk_cicd_12.png

対象のチャンネルに追加します。

backlog_git_snyk_cicd_12.png

Backlog GitにWebhookを設定

Backlog Gitの設定からWebhook URLを設定します。

backlog_git_snyk_cicd_03.png

これで準備は整いました。

動作確認

リポジトリにコードをプッシュして、CodeBuildが実行されることを確認します。

backlog_git_snyk_cicd_04.png

Slack通知

Slack通知でサマリーを確認することができます。

backlog_git_snyk_cicd_13.png

Snyk Web UI

SnykのWeb UIにアクセスし、スキャン結果を確認します。

プロジェクト一覧から該当リポジトリを選択すると、検出された脆弱性の詳細を確認できます。

backlog_git_snyk_cicd_15.png

backlog_git_snyk_cicd_16.png

buildspecの以下の処理でWeb UIで確認できるようになります。

- echo "=== Sending results to Snyk Web UI ===" - | snyk monitor \ --project-name="${APP_DIR}" \ --org="${SNYK_ORG:-default}" \ --remote-repo-url="${REPO_PATH}/oss" \ --target-reference="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')" \ || echo "Failed to send dependency scan to Snyk" 

2025/10/10のアップデートでCodeも--reportオプションを付けることでWeb UIで確認できるようになりました。

- echo "=== Sending Code results to Snyk Web UI ===" - | snyk code test --report \ --org="${SNYK_ORG:-default}" \ --project-name="${REPO_PATH}/code" \ --target-name="${REPO_PATH}/code" \ --target-reference="$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')" \ || echo "Failed to send code scan to Snyk" 

HTML

buildspecでは以下の処理でスキャン結果のHTMLをアーティファクトに含めています。

- echo "=== Generating HTML Reports ===" - snyk-to-html -i snyk-opensource-report.json -o snyk-opensource-report.html || true - snyk-to-html -i snyk-code-report.json -o snyk-code-report.html || true 

Snykのスキャン結果をJSON形式で出力し、それをHTMLレポートに変換してS3バケットにアーティファクトとして保存しています。

Slack通知にはS3のリンクを含んでいますので、マネジメントコンソールからダウンロードして確認することができます。

backlog_git_snyk_cicd_14.png

CloudWatch Logs

CodeBuildのCloudwatch Logsでも確認できます。

backlog_git_snyk_cicd_17.png

さいごに

BacklogのWebhook機能とAWSサービスを組み合わせることで、SnykによるセキュリティスキャンをBacklog Gitリポジトリに対して実行する仕組みを構築しました。

BacklogはCI/CD機能を持たないため、このようなアーキテクチャを活用することで、自動化処理を実現できます。

この記事がどなたかの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事