コンテナベースの開発パイプラインでセキュリティを実装する際の勘所とは?【デブサミ2020夏】
【A-8】コンテナベースの開発パイプラインへ“セキュリティ”を実装してみよう
軽量なイメージ、ポータビリティ、充実したツールセット、豊富なエコシステムなどの特徴を持つことから、コンテナをベースとした開発は今非常に普及しつつある。このように開発において便利に活用できるコンテナだが、その一方で本番環境での運用においては、セキュリティ面で問題になることも多い。またライフサイクルコンテナも特殊であることから、それをどう継続的に見ていくかも課題の1つである。そこでコンテナにはどういう特性があり、どのようにしてセキュリティを実装していけばよいのか。その勘所などについて、マクニカネットワークスでコンテナ系の開発を担当している技術部 主席エンジニア 野原峰彦氏が解説した。
コンテナがもたらすメリットとは
「コンテナは普及しつつあるステージにある」
こう語り、野原氏のセッションはスタートした。
Dockerをはじめとするモダンなコンテナアーキテクチャは、「非常に軽量」「ポータビリティ性が高い」などの特徴がある。軽量であることから、起動も非常に高速で、開発やテストの高速化が可能になる。またポータビリティの高さは、依存関係を含めてパッケージングされているため、これにより「環境依存による不具合を削減できる」と野原氏は言う。
これにコンテナオーケストレーターを加えると、デプロイメントのコードがYamlやJSONになり自動化しやすくなる。オートヒーリングにより運用の簡略化、さらにはスケールアウト・スケールインの自動化などが可能になる。「従来、人の手でやっていた作業を自動化して効率化することが可能になる。Docker社がBuildやShip、Runに納めることができると言っていることが実現する」と野原氏は説明する。
また、コンテナはDevOpsとの親和性が非常に高い。例えば、Flickrは「早期にリリースし、頻繁にリリースする」ということを実践していた。これを可能にしていたのが、「DevとOpsが協力しようという取り組みだった」と野原氏は話す。それを可能にするために、Flickrではキーとなる10項目を挙げている。これらの項目はツールやテクノロジーによるものと、企業文化によるものに大別されている。
ツールやテクノロジーによる取り組みとしては、「1.インフラの自動化」「2.一元管理されたバージョンコントロール」「3.ビルドからデプロイまでのオペレーションの自動化」「4.機能の無効化/有効化」「5.明確な指標の共有」「6.通知の自動化」が挙げられる。
これを現在に置き換えると、インフラの自動化であればInfrastructure as Code(IaC)、一元管理されたバージョンコントロールであればGitや成果物管理の仕組み、ビルドからデプロイまでのオペレーションであればCI/CDツール、機能の無効化/有効化であればブルー・グリーンやカナリアリリース、Circuit Breakerなどの方法が該当するわけだ。
一方、企業文化による取り組みについては「リスペクト」「信頼」「問題発生時のあるべき対処」「責任追及の排除」といった項目を挙げている。
「つまり、DevOpsは開発から運用までのプロセスにおいて無駄を排除したり、効率化したりする活動で、特定のプロセスや手法ではないということ。そしてDevOpsは、多くのケースにおいて継続的改善を行うために取り入れることが多い」と野原氏は指摘する。つまり、DevOpsとはビジネス課題に対して迅速なアクションを取ることができるチームをつくることであるというわけだ。
DevOpsによってもたらされる主なメリットは、無駄の排除や業務の効率化が実現すること。「新しいサービスを市場にいち早く投入できることで、先行サービスの優位性が得られます。また、より多くのフィードバックも得られるため、品質の改善やエクスペリエンスの改善ができ、競争力強化につながります」(野原氏)
DevOpsでは、ツールを使って次のようなモダンな開発環境を構築することが求められる。ビジネス要件に対して開発者がコードをコミットしGitにアップ、そのコミットしたコードに対してCI/CDツールが動いてビルド・テストをする。その結果に問題があれば通知を開発者に送り、開発者は修正したコードをGitに入れる。CI/CDツールでのテスト結果に問題がなかった場合は、デリバリ/デプロイを行う。デリバリされたプログラムは、ユーザーからフィードバックを受け、それが新たなビジネス要件になるのだ。
だが、このようには簡単にことは進まない。CI/CDツールでは動いたのに本番環境では動かないなどの問題が発生するという。「なぜか環境依存の問題はすごく多い」と野原氏は指摘する。この問題を解決できる手法としてコンテナ化は非常に有効であるそうだ。
コンテナ環境ではカナリアリリースも容易に自動でできる。例えば、Webアプリケーションを2つのコンテナにトラフィックを半々に分けて提供する仕組みを構築していたとする。新しいバージョンのWebアプリケーションを開発者がコミットすると、CIツールがそれをフックしてコンテナにデプロイする。新しいバージョンのコンテナにトラフィックの10%を振り分けるようトラフィック比率を変更し、一定時間経過後にエラーレートを確認。そこで問題がなければ、古いバージョンを消去し、従来通り新しいバージョンを2つのコンテナにトラフィックを振り分けてユーザーに提供するという仕組みが完成する。こういったことができるのもコンテナが軽量だからだ。
この記事は参考になりましたか?
- この記事の著者
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営する開発者のための情報メディアです。日々の開発に取り組むエンジニアやテクノロジーを学びたい方に向けて、プログラミングやAI活用、開発ツール、エンジニアの学びとキャリアに関する記事をお届けしています。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社
この記事は参考になりましたか?
この記事をシェア
