高度なDevSecOpsパイプラインのカスタマイズ
最初のアプリケーションやマイクロサービスを導入した後に、 DevSecOps の高度な機能について学びましょう。
必ず確認してください の基礎DevSecOpsパイプラインのカスタマイズ。 ここでは、利用可能なさまざまなテンプレート、サポートオプション、その他の重要な情報について知ることができます。DevSecOps。
設計の選択肢
より多くのアプリケーションやマイクロサービスを導入する中で、DevSecOps,次のような設計上の質問があるかもしれません。
- マイクロサービスごとに 1 つのツールチェーンが必要ですか?
- マイクロサービスごとに 1 つのパイプラインが必要ですか?
- 共有のDevSecOps在庫と問題用のリポジトリが必要ですか、それとも別のリポジトリが必要ですか?
以下の情報とベスト・プラクティスは、これらの設計を選択する際に役立ちます。
ツールチェーンおよびパイプラインに関する考慮事項
ほとんどのアプリケーションは、異なるソース・リポジトリーを持つ複数のマイクロサービスで構成されています。 通常、論理的にグループ化されたマイクロサービスをホストするために単一のツールチェーンが使用されます。 一般に、1 つのツールチェーンと 1 つのパイプラインを使用するか、可能な限り少数のパイプラインを使用しますが、複数のトリガーを使用します。 各パイプライン内で、必要な数のトリガー (パイプラインごとに最大 1024 個のトリガー) を複製して構成することができます。 この戦略は、共通のプロセス、スクリプト、および構成ファイルを適用するのに役立ちます。 詳しくは、 1 つの CI ツールチェーンでの複数のアプリケーションの構成 を参照してください。
このアプローチには次のような利点がある:
- 使用するパイプラインの数を減らすことで、重複を回避し、エラーを減らすことができます。 また、環境プロパティーまたはシークレットが追加、編集、または削除された場合などにも、更新の保守が容易になります。
- この方法を使用すると、サービスのオンボーディングにかかる時間が短縮されます。 マイクロサービス用の Git 統合を追加し、 Git と手動トリガーを複製し、必要に応じて変更します。 次に、マイクロサービス用に
.pipeline-config.yamlファイルとスクリプトが実装されていることを確認します。
この方法には、以下の欠点があります。
- 1 回の編集で、同じパイプラインを使用しているすべてのチームに影響を与えることができます。
- ユーザー・アクセスは、 Identity and Access Management(IAM) を使用して管理され、パイプライン・レベルではなくツールチェーン・レベルで設定されます。 そのため、複数のサービスに単一のツールチェーンを使用している場合、チームのすべてのメンバーが他のチームのパイプラインを表示できます。 IAM でのユーザーのアクセス権限によっては、パイプラインを編集、削除、またはトリガーできる場合があります。
課金に関する考慮事項
Continuous Delivery サービスは、CDインスタンスごとの認証ユーザー数と、ツールチェーンに使用するリソースグループの数に基づいて課金を決定します。 リポジトリーへのアクセス権限を持つユーザーも、許可ユーザーと見なされます。 詳しくは、許可ユーザーを参照してください。 コストを削減するには、すべてのツールチェーンを同じリソースグループにまとめるか、 Continuous Delivery、企業アカウント階層内で連結課金を構成する必要があります。 詳細については、 連結請求を 参照のこと。
DevSecOpsリポジトリの考慮事項
複数のマイクロサービスで構成されるアプリケーションを作成する場合、ほとんどの場合、DevSecOps証拠リポジトリを除くリポジトリは、マイクロサービス間で共有できます。
詳細については、どうやってDevSecOpsパイプラインはリポジトリを使用する。
共有構成リポジトリーに関する考慮事項
のDevSecOpsサンプル アプリケーションには、共存する が付属しています。pipeline-config.yaml構成ファイルと対応するスクリプト。 複数のマイクロサービスをオンボードする場合、ソースコードリポジトリを分離することがベストプラクティスです。DevSecOps構成ファイルとスクリプト。 これらを、CI、CD、または CC パイプラインで使用できる別個の専用共通構成リポジトリーに保管します。
これは以下で構成されます。
- 共通スクリプト・ライブラリーおよび.pipeline-config.yaml ファイルをホストするための専用 Git リポジトリー。
- すべてのサービスに共通する単一のpipeline-config.yaml ファイル。 複雑すぎるか、不可能である場合は、別の.pipeline-config.yaml ファイルを使用してください。
- フォルダー単位でのカスタマイズ。 構成リポジトリー内のさまざまなスクリプト・フォルダーを指すように.pipeline-config.yaml ファイルを実装します。 スクリプトは、別個の CI、CD、および CC フォルダーに編成するか、サービス言語 (Go、 Python、 NodeJS)、サービス、アプリケーション名、またはニーズに最も適したものに基づいて編成します。
pipeline-config-repo パイプラインプロパティ(オプションで pipeline-config-branch )の値を共有設定リポジトリ URL に設定することで、この共有設定リポジトリを使用するようにパイプラインを変更します。
インベントリー・リポジトリーの考慮事項
単一のインベントリー・リポジトリーを多数のパイプラインおよびツールチェーンで共有できます。 複数の CI ツールチェーン、パイプライン、およびトリガーが、同じインベントリー・リポジトリーにコントリビュートすることができます。 CI パイプラインは、通常はリリース・ステージ中に、在庫リポジトリーに更新をプッシュします。 インベントリー・リポジトリーは、CD パイプラインのソース入力として使用されます。 一般に、最終的に作成される変更要求の数を減らすために、インベントリー・リポジトリーを同じツールチェーンにグループ化することがベスト・プラクティスです。
共有インベントリー・リポジトリーの使用は、マイクロサービスのオンボーディングを開始する前に行う必要があるアーキテクチャー上の決定です。これは、この決定が、パイプラインの実行時に作成される変更要求の数に影響するためです。 例えば、10個のマイクロサービスをオンボードするとします。DevSecOps。 10 個の異なる CD ツールチェーンと 10 個の異なるインベントリー・リポジトリーを持つことができます。これにより、CD パイプラインが実行されるたびに 10 個の異なる変更要求が生成されます。 これらの 10 種類のマイクロサービスは、共通のインベントリー・リポジトリーと共通の CD ツールチェーンを共有することで管理が容易になります。 これにより、複数のマイクロサービスに対して更新を行った場合でも、すべてのマイクロサービスがインベントリー・リポジトリーとツールチェーンを共有するため、変更要求は 1 回のみになります。
問題リポジトリーの考慮事項
問題リポジトリーでは、マイクロサービスのすべての脆弱性問題が追跡されます。 共有インベントリー・リポジトリーを使用することにした場合は、共有問題リポジトリーも使用することをお勧めします。
incident-assigness および incident-labels をパイプライン・レベルまたはトリガー・レベルで設定すると、正しいチームに問題を自動的に割り当てることができます。 詳しくは、 継続的デプロイメントのパラメーター を参照してください。
IBM Cloud Object Storage の考慮事項
共有インベントリリポジトリを使用している場合は、 IBM Cloud® Object Storage の共有インスタンスも使用できます。 以下のステップを実行します。
- ツールチェーンおよびパイプライン全体で使用する IBM Cloud Object Storageのインスタンス を作成します。
cos-bucket-name環境プロパティーを設定して、 IBM Cloud Object Storage バケットを使用するようにパイプラインとトリガーをセットアップします (該当する場合)。
同じCI、CD、CCパイプライン内のすべてのマイクロサービスは、デプロイ環境に関係なく、1つの Object Storage バケットを共有します。 Object Storage バケツは証拠保管所と同様の機能を持つが、実質的な証拠保管所で起こりうるパフォーマンスの問題はない。 かなりの Object Storage バケットではパフォーマンスの問題は発生しないので、 Object Storage バケットからエビデンスを刈り込む必要はない。
Object Storage バケット粒度
DevSecOps パイプラインは、 Object Storage バケツの粒度について意見を言うことはない。 技術的には、組織全体で単一の Object Storage バケットを使用することができます。 しかし、インベントリは一緒に移動できるマイクロサービスの最小の論理的グループであるため、粒度はインベントリより小さくすべきではありません。
実際には、コンプライアンス・チームがコンプライアンス・データの管理にどのような運用モデルを望むかによって、粒度が変わってくる:
- コンプライアンス・チームが、データを区分けして複数の Object Storage ・バケットを管理することに抵抗がないのであれば、それは有効なモデルである。
- もし、より大きなバケット( Object Storage )で、分割されていないデータを管理したいのであれば、それも可能である。
重要な考慮点: Object Storage バケツ(エビデンスロッカー)は、人間が読めるものではなく、システムが読めるものを意図している。 リポジトリ別、マイクロサービス別、製品別、組織別のフォルダ構造はサポートしないし、当面はサポートしない。 資産と証拠の平坦化された構造のままである。
セキュリティとアクセスに関する考慮事項
Object Storage バケットの粒度を小さくすることで、セキュリティ侵害(例えば、 Object Storage API キーの漏洩)が発生した場合の爆発範囲を広げることができる。 また、同じバケットを共有している場合、ある製品が他の製品のコンプライアンス・データを読み取る可能性があるという、クロスビジビリティの懸念が生じる可能性もある。
移行に関する考慮事項
必要であれば、 Object Storage バケット間で移行する方法がある。 これには通常、バックアップ用 Object Storage バケットに特定の環境プロパティを設定し、CIコンポーネントを再構築することが含まれる。 詳しくはこの ドキュメントを 参照。 しかし、これらの作業は単発的な移行作業を意図したものであり、日常的な業務ワークフローの一部として設計されたものではない。
推奨されるアプローチ
コンプライアンス データを一緒に移動する必要がある論理的な製品グループごとに、 Object Storage バケットを 1 つ使用します。 以下に例を示します。
- サービスチームA(チーム内の全分隊を含む)は、 Object Storage バケツAを共有する
- サービスチームB(その中の全チームを含む)は、 Object Storage バケツBを共有する
このアプローチは、運用の簡便さとセキュリティおよびアクセス制御の要件のバランスをとるものである。
複数の環境へのデプロイ
CD パイプラインを使用して複数のターゲット環境にデプロイするには、いくつかの方法があります。
各 targeted environment には、在庫リポジトリー内に対応するブランチが必要です。このブランチでは、変更が source ブランチから target ブランチにプロモートされます。
以下のオプション設計は、ご使用のアーキテクチャーに適合する可能性があります。
- ターゲット環境ごとに 1 つの手動トリガーを使用します。 トリガーを複製してから、新しい環境に合わせて環境プロパティーを編集します。
- ターゲット環境ごとに 1 つのフォルダーを持つ Git 構成リポジトリーを使用します。ここで、特定の構成設定がファイルに保管されます。
デフォルト・スクリプトおよびカスタム・スクリプトの操作
ほとんどのセキュリティー・スクリプトおよびコンプライアンス・スクリプトには、ステージ用のカスタム・スクリプトが提供されていない場合に実行される デフォルト・スクリプト が付属しています。 実行するスクリプト、対応するソース・スクリプトを見つける場所、およびデフォルト・スクリプトをオーバーライドする方法を判別するのが困難な場合があります。
実行するスクリプトの識別
ステージに対して実行されるスクリプトを識別するには、パイプライン実行 (できれば CI パイプライン) を開きます。 タスクを展開し、 run-stage をクリックしてログを開きます。 run-stage ログの先頭には、ステージで使用されたスクリプトに関する情報 (スクリプトが置かれているリポジトリーを含む) が示されます。 ログをスクロールすると、実行されたスクリプトに関する詳細を確認できます。 例えば、 code-compliance-checks タスクの run-stage ログには、ステージの環境プロパティーを含む以下の情報が記録されている場合があります。
compliance-checks:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
dind: true
abort_on_failure: false
image_pull_policy: IfNotPresent
script:
#!/bin/sh
"/opt/commons/compliance-checks/run.sh"
この例では、実行されるスクリプトは /opt/commons/compliance-checks/run.sh です。これは、 commons ライブラリー にあります。 このコモンズ・ライブラリーを、特定のエッジ・ケース用にカスタマイズできるコードをコピーするためのソースとして使用します。
この例では、 compliance-checks/run.sh は compliance-commons ライブラリー にあります。
デフォルト・スクリプトのオーバーライド
デフォルトのスクリプトをオーバーライドするには、以下のステップを実行します。
- ステージ・ログで、デフォルト・スクリプトを識別するスニペットをコピーします。
compliance-checks:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
dind: true
abort_on_failure: false
image_pull_policy: IfNotPresent
script:
#!/bin/sh
"/opt/commons/compliance-checks/run.sh"
- スニペットを
.pipeline-config.yamlファイルに貼り付けます。 - スクリプトが呼び出される前または後にカスタム・コードを追加します。 このスニペットは、デフォルト のコンプライアンスチェックスクリプト を呼び出します
- 必要に応じて、プロパティーを編集、削除、または追加します。
以下の例は、 .pipeline-config.yaml ファイル内の更新されたスクリプトを示しています。
compliance-checks:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
dind: true
abort_on_failure: false
image_pull_policy: IfNotPresent
script: |
#!/bin/sh
# run some custom script here
./scripts/my-custom-script1.sh
"/opt/commons/compliance-checks/run.sh"
# then some additional work
./scripts/my-custom-script2.sh
詳しくは、 カスタム・スクリプト を参照してください。
使用するTerraformテンプレートDevSecOpsツールチェーンをコードとして
以下のツールチェーンは、作成するためのコードを提供します。DevSecOpsTerraform を使用した CI、CD、CC ツールチェーン:
これらの Terraform ツールチェーンへの早期アクセスは、現状のままで提供されます。 これらのツールチェーンはアクティブな開発中であるため、変数および変数名が変更される可能性があります。