Slide 1

Slide 1 text

GitHubとGitLabと AWS CodePipelineで CI/CDを組み比べてみた 2025.09.10 Satoshi Kaneyasu

Slide 2

Slide 2 text

2 発表者自己紹介 氏名:兼安 聡 所属:株式会社サーバーワークス アプリケーションサービス部 在住:広島(フルリモート) 担当:DevOps、技術支援、PM、SM SNS(X):@satoshi256kbyte • 2025 AWS Community Builders • 2025 Japan AWS Top Engineers (AI/ML Data Engineer) • 2025 Japan AWS All Certifications Engineers • 認定スクラムマスター • PMP

Slide 3

Slide 3 text

3 目次 ⚫今回検証したかったこと ⚫AWS CodePipelineでの実装例 ⚫GitHub Actionsでの実装例 ⚫GitLab CI/CDでの実装例 ⚫まとめ

Slide 4

Slide 4 text

4 今回検証したかったこと デプロイ前にセキュリティ含めたチェックをするCI/CDパイプラインを組んで みようと思いました 品質・セキュリティに課題があるコードをデプロイしないことが目的です これを実現するにはどのツールでどのように組んだらいいか検証してみました ソース Lint ソースコードの構文チェックなど Unit Test SCA 使用ライブラリの脆弱性チェック SAST セキュリティ観点の静的コードチェック デプロイ

Slide 5

Slide 5 text

5 今回検証したかったこと、補足 ⚫ソース管理自体はGitHubで行っています ⚫検証に用いたコードはPython3.13、パッケージ管理はuvです 次のページから話題が変わります

Slide 6

Slide 6 text

AWS CodePipelineでの実装例

Slide 7

Slide 7 text

7 AWS CodePipelineでの実装例

Slide 8

Slide 8 text

8 並列実行と直列実行 直列実行 並列実行 並列実行

Slide 9

Slide 9 text

9 並列実行と直列実行 アクションを小分けにして並列実行 buidspec も分割

Slide 10

Slide 10 text

10 キャッシュの活用 キャッシュを作った上で、 並列実行 ここでキャッシュを作る

Slide 11

Slide 11 text

11 キャッシュの活用 キャッシュタイプを「Amazon S3」にした上で、 buildspecでキャッシュキーを指定することで ビルドプロジェクト(=コンテナ)を跨いだキャッシュが使用 可能になる asdfとuvを使っているのでこの2つのファイルを使ってキャッシュキーを生成 パスの指定の仕方が、GitHub・GitLabとは異なるので注意 パスそのものではなく、パスパターンに合致するものがキャッシュ対象

Slide 12

Slide 12 text

12 SCAとSASTの実装方法 Amazon Inspector Amazon CodeGuru Security

Slide 13

Slide 13 text

13 SCAとSASTの実装方法 ⚫Amazon InspectorによるSCAはCodePipelineに組み込むことができます ⚫一点だけ注意 Pythonの場合Inspectorはrequirements.txtをチェックするので、 uv exportしてuv.lockからrequirements.txtを出力しておく必要があります ⚫Amazon InspectorはSASTもできますが、 同期処理にする方法が見つからないため、CI/CDに組み込めませんでした ⚫それ故にSASTにCodeGuru Securityを使用していましたが、 CodeGuru Securityは2025年11月のサービス終了となってしまいました ⚫CodePipelineだけでやりたいことは実現できていたのに残念です

Slide 14

Slide 14 text

14 AWS CodePipelineで実装してみた所感 ⚫Code系・S3・IAMロールの知識などを総動員しないと使いこなせな いため、とっつきにくく一番難しいと思います ⚫今回の検証では一番時間かかりました(一番触っているはずなのに) ⚫ 検証期間二週間中約半分がCodePipeline ⚫パイプラインをIaCでも手動でも作成・編集できてしまうのが厄介 次のページから話題が変わります

Slide 15

Slide 15 text

GitHub Actionsでの実装例

Slide 16

Slide 16 text

16 GitHub Actionsでの実装例

Slide 17

Slide 17 text

17 並列実行と直列実行 GitHub Actionsはジョブ同士は並列実行が可能 ジョブの中のステップは直列実行となります 参考:GitHub Actions の構造と変数を整理して、AWSのデプロイ先を分岐させてみよう

Slide 18

Slide 18 text

18 GitHubでの実装例 並列実行

Slide 19

Slide 19 text

19 並列実行と直列実行 cicd.yml ジョブを分けることで並列実行にしつつ、 needsで順番を指定

Slide 20

Slide 20 text

20 キャッシュの活用 asdfとuvを使っているのでこの2つのファイルを使って キャッシュキーを生成 sha256sum関数でファイルをハッシュ文字列化 パスの指定の仕方はCodePipelineとは異なる 指定したパスそのものがキャッシュ対象

Slide 21

Slide 21 text

21 AWSの操作 - AWS SAMによるデプロイ OIDCでAWSアカウントに接続して 操作します OIDCを使用するのにパーミッションが必要です 事前に用意したOIDC用のIAMロールのARNを シークレットで設定しておき、使用します 参考:アマゾン ウェブ サービスでの OpenID Connect の構成

Slide 22

Slide 22 text

22 AWSの操作 - Amazon EC2へのデプロイ① EC2へのデプロイは、 事前にCodeDeployでアプリケーションと デプロイメントグループを作っておき、それを呼び出す 形を取っています。 S3へコード一式をアップしてから、 新規デプロイを作成するコマンドを発行します。

Slide 23

Slide 23 text

23 AWSの操作 - Amazon EC2へのデプロイ② EC2へのデプロイは非同期処理なので、 待機処理が必要

Slide 24

Slide 24 text

24 SCAとSASTの実装方法① ⚫GitHubはSCAはDependabot、SASTはCodeQLが使用できますが、 どちらもCI/CDに組み込むのがかなり難しいと感じました ⚫CodeQLはGitHub Actionsから起動はできましたが、 結果をGitHub Actionsの中で受け取るところまで至れませんでした また、使用料金もプラン次第なところがあるので、SIerとしてCI/CD に組み込むのは難しいと感じます ⚫Dependabotの方はGitHub Actionsからの能動的に起動する方法自体 が見つかりませんでした。

Slide 25

Slide 25 text

25 SCAとSASTの実装方法② ⚫代替としてOSSのTrivyとSemgrep CEでSCA、SASTを使用しました ⚫SemgrepはCE版だとSAST機能しか利用できないので、SCAはTrivyに任せます ⚫SASTにSemgrepを選んだのは、GitLabのSASTのコードを確認したとこ ろ、Semgrepが使われていたからです

Slide 26

Slide 26 text

26 GitHubで実装してみた所感 ⚫設定ファイルの書き方に癖がなく書きやすい ⚫今から始めるならこちらが楽だと思います ⚫AWSの操作にOIDCを使う部分が一つの壁 ⚫そこを乗り越えればいろんなことができると思います ⚫GitHub ActionsからのAWSの操作は作り込みが必要ですが、 設定が分散したりはしないのでそこまで気にはなりません ⚫自分としては、SCA・SASTを経てのデプロイがやりたかったのだが DependabotとCodeQLはそれとは考え方が違うように思えます 次のページから話題が変わります

Slide 27

Slide 27 text

GitLab CI/CDでの実装例

Slide 28

Slide 28 text

28 GitLab CI/CDでの実装例 全体的に操作感がGitHub Actionsによく似ている

Slide 29

Slide 29 text

29 並列実行と直列実行 stagesという概念があるものの、 GitHubと同じようにジョブを分ければ並列となり、 needsで順番を作ることができる

Slide 30

Slide 30 text

30 AWSの操作 GitHub同様OIDCが使用できる 参考: Configure OpenID Connect in AWS to retrieve temporary credentials

Slide 31

Slide 31 text

31 キャッシュの活用 GitLabでファイルをキーの一部とする場合は、filesが使用で きる 参考:Caching in GitLab CI/CD パスの指定の仕方はGitHubと同じだが、ディレクトリ構成 が違う模様 GitHubのように~/.cargoなどと指定するとキャッシュが空 振りするので、何かインストールするなら作業ディレクトリ直 下に置くようにし、そこをキャッシュ対象にすると効きやすい ※コンテナベースイメージも同じOSだが他と異なるようで、 GitHub・CodePipelineに比べ動かすのに多数のインストールが必要

Slide 32

Slide 32 text

32 SCAとSASTの実装方法 ⚫GitLab謹製でSCAとSASTがあるが、Ultimateプランが必要です ⚫検証した限りではSCAはUltimateでなくとも動かすことができたが、 実運用で使うならちゃんとUltimateプランにした方がよいでしょう ⚫ 参考:各プランのGitLab機能の比較 ⚫ 流石にUltimateは個人の検証レベルでは契約できないです・・・ ⚫なお、検証時した限りでは、GitLabのSCAは呼び出しはできるけど、結果のチェッ クは本来CI/CDでやるものではないらしく、チェック処理を自分で作る必要がありま した

Slide 33

Slide 33 text

33 GitLabで実装してみた所感 ⚫GitHub同様設定ファイルの書き方に癖がなく書きやすいが、 ネット上にそこまで情報が多くないのがネックです ⚫その他の感想はGitHubと同じです 次のページから話題が変わります

Slide 34

Slide 34 text

まとめ

Slide 35

Slide 35 text

35 各ツールの所感 ⚫ 実装のしやすさは、GitHub>GitLab>>>AWS CodePipeline ⚫ 今からCI/CDを始めるならGitHub Actionsが一番やりやすいと思います ⚫ CodeGuru Securityが使用可能ならやりたかったことはCodePipelineで完 結したのに、EOLが発表されるとは思っていませんでした・・・

Slide 36

Slide 36 text

36 今自分が考えるCI/CDの組み合わせ デプロイ時は CodePipeline プルリクエスト作成時は GitHub Actions

Slide 37

Slide 37 text

37 組み合わせの理由 ⚫ CodePipelineはAWSで完結できる上、 InspectorによるSCAがCI/CDに 組み込めるのが大きい ⚫ CodeGuru SecurityがEOLになったのは残念で代替は探しますが、 よくよく考えたらライブラリと違ってソースコード自体は時間が経っても勝手に脆弱 性が増えたりはしないので、SASTは他に逃すなどの回避策を取ってもよいと思い ました ⚫ 開発中のチェックは、チェック自体にも試行錯誤することがあるので、変更にデプロ イが必要なCodePipelineよりもGitHub Actionsでやった方が効率がよいと 思います 以上です、ありがとうございました

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

39 Appendix - 参考資料 ⚫ CodePipeline  End of support for CodeGuru Security ⚫ GitHub  GitHub Actions の構造と変数を整理して、AWSのデプロイ先を分岐させてみよう  アマゾン ウェブ サービスでの OpenID Connect の構成 ⚫ GitLab  Configure OpenID Connect in AWS to retrieve temporary credentials  Caching in GitLab CI/CD  各プランのGitLab機能の比較 ⚫ Trivy ⚫ Semgrep