IaCで一貫したタグ付けを自動化するためのOSS、Yorを試してみた

こんにちは。枡川です。

CloudFormationやTerraformなどIaCテンプレートへの一貫したタグ付けを行うためのOSSであるYorについて試してみました。
Bridgecrewが管理しているGo製のOSSになります。

このOSSには単にタグ付けを便利にしようという所に留まらず、Gitから引っ張った情報を適切に付与してトレーサビリティを上げようというコンセプトがあります。

タグの種類

Yorには下記3種類のタグ付け機能が存在します。

Tracing Tagger

Yor実行時にyor_traceという一意のIDを生成します。
IaCのテンプレートとクラウド上のリソースをIDで結びつけることを可能にします。

Git-based Tagger

いつ誰のコミットで対象リソースが変更されたかについて記録したタグをリソースに付加します。
クラウド上のリソースについて誰が所有しているかなどの情報を得ることができます。

Custom Taggers

ユーザーが各自でタグを定義することができます。
全リソースにenvタグを付加したりすることが可能です。
環境変数や設定ファイルを使用して定義します。

Custom Taggersはタグの付け忘れ防止に役立ち、便利さを簡単に実感できる部分だと思います。
その上で、Traicing TaggerやGit-based Taggerを使用することでIacテンプレートとクラウド上のリソースのトレーサビリティを高めることができます。
誰がいつ変更したのか、これらのリソースは誰が所有しているのか、Github等を見に行けば情報にたどり着けるのですが、より簡単に情報にたどり着くための手助けをしてくれます。

インストール

macの場合はhomebrew経由でインストール可能です。

brew tap bridgecrewio/tap
brew install bridgecrewio/tap/yor

Dockerも用意されています。

docker pull bridgecrew/yor
docker run --tty --volume /local/path/to/tf:/tf bridgecrew/yor tag --directory /tf

インストールしてyorコマンドを実行してみます。
2022/1/28時点の最新版は0.1.133でした。
(月に複数回バージョンアップが入っていて、現在活発に開発されている最中であることがわかります。)

$ yor
NAME:
   yor - enrich IaC files with tags automatically

USAGE:
   yor [global options] command [command options] [arguments...]

VERSION:
   0.1.133

DESCRIPTION:
   Yor, the IaC auto-tagger

AUTHOR:
   Bridgecrew <support@bridgecrew.io>

COMMANDS:
   list-tags        List the tags yor will create if possible
   list-tag-groups  List the tag groups that will be applied by yor
   tag              apply tagging across your directory
   help, h          Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h     show help (default: false)
   --version, -v  print the version (default: false)

試してみた

タグの設定一覧を確認します。
記載のある内容をタグ付けしてくれます。

$ yor list-tags
+------------+----------------------+--------------------------------+
|   GROUP    |       TAG KEY        |          DESCRIPTION           |
+------------+----------------------+--------------------------------+
| simple     |                      |                                |
+------------+----------------------+--------------------------------+
| external   |                      |                                |
+------------+----------------------+--------------------------------+
| code2cloud | yor_trace            | A UUID tag that allows easily  |
|            |                      | finding the root IaC config of |
|            |                      | the resource                   |
+------------+----------------------+--------------------------------+
| git        | git_org              | The entity which owns the      |
|            |                      | repository where this resource |
|            |                      | is provisioned in IaC          |
+            +----------------------+--------------------------------+
|            | git_repo             | The repository where this      |
|            |                      | resource is provisioned in IaC |
+            +----------------------+--------------------------------+
|            | git_file             | The file (including path)      |
|            |                      | in the repository where this   |
|            |                      | resource is provisioned in IaC |
+            +----------------------+--------------------------------+
|            | git_commit           | The hash of the latest commit  |
|            |                      | which edited this resource     |
+            +----------------------+--------------------------------+
|            | git_modifiers        | The users who modified this    |
|            |                      | resource                       |
+            +----------------------+--------------------------------+
|            | git_last_modified_at | The last time this resource's  |
|            |                      | configuration was modified     |
+            +----------------------+--------------------------------+
|            | git_last_modified_by | The last user who modified     |
|            |                      | this resource                  |
+------------+----------------------+--------------------------------+

下記のようなEC2を構築する簡単テンプレートを使用して、タグ付けを実施してみます。

Resources:
# ------------------------------------------------------------#
#  EC2
# ------------------------------------------------------------#
  IAMRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      RoleName: !Sub ${SystemName}-${EnvironmentName}-ec2-role
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvironmentName}-ec2-role
  myInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Path: "/"
      Roles:
        - !Ref IAMRole
  EC2:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: !Ref AMI
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 30
            DeleteOnTermination: true
      SecurityGroupIds:
        - { "Fn::ImportValue": !Sub "${EnvironmentName}-EC2SG" }
      SubnetId: 
        { "Fn::ImportValue": !Sub "${EnvironmentName}-PublicSubnet1" }
      IamInstanceProfile:
        !Ref myInstanceProfile
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvironmentName}-ec2
  EIP:
    Type: "AWS::EC2::EIP"
    Properties:
      InstanceId: !Ref EC2
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvironmentName}-eip

下記のようなタグが生成されて、テンプレートに付加されました。

yor tag -d .
  __    __
  \ \  / /
   \ \/ /___  _  ____
    \  /  _ \| |/  __|
    | |  |_| |   /
    |_|\____/|__|v0.1.133
 Yor Findings Summary
 Scanned Resources:       4
 New Resources Traced:    3
 Updated Resources:       0

New Resources Traced (3):
+---------+----------+----------------------+------------------------------------------+--------------------------------------+
|  FILE   | RESOURCE |       TAG KEY        |                TAG VALUE                 |                YOR ID                |
+---------+----------+----------------------+------------------------------------------+--------------------------------------+
| ec2.yml | EIP      | yor_trace            | f8abc20a-492b-4fcf-9da8-4384e28b8bf8     | f8abc20a-492b-4fcf-9da8-4384e28b8bf8 |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_file             | ec2.yml                                  |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_commit           | 26e358cfd4a3bd61069350b4f5828129625cf92e |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_modifiers        | masukawa.kentaro                         |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_last_modified_at | 2022-01-25 02:29:12                      |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_last_modified_by | masukawa.kentaro@xxxxxxxxxxxxx           |                                      |
+         +----------+----------------------+------------------------------------------+--------------------------------------+
|         | IAMRole  | yor_trace            | a754d004-7e1d-4246-9796-9287bf571de5     | a754d004-7e1d-4246-9796-9287bf571de5 |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_file             | ec2.yml                                  |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_commit           | 26e358cfd4a3bd61069350b4f5828129625cf92e |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_modifiers        | masukawa.kentaro                         |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_last_modified_at | 2022-01-25 02:29:12                      |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_last_modified_by | masukawa.kentaro@xxxxxxxxxxxxxxxxxx      |                                      |
+         +----------+----------------------+------------------------------------------+--------------------------------------+
|         | EC2      | yor_trace            | 742ec4a4-e9be-4d62-822c-864b37a02c78     | 742ec4a4-e9be-4d62-822c-864b37a02c78 |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_file             | ec2.yml                                  |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_commit           | 26e358cfd4a3bd61069350b4f5828129625cf92e |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_modifiers        | masukawa.kentaro                         |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_last_modified_at | 2022-01-25 02:29:12                      |                                      |
+         +          +----------------------+------------------------------------------+                                      +
|         |          | git_last_modified_by | masukawa.kentaro@xxxxxxxxxxxxx           |                                      |
+---------+----------+----------------------+------------------------------------------+--------------------------------------+

コミットのハッシュ値をタグに付けておけば、最近当該リソースに変更を加えたテンプレートをGithub等で簡単に検索できますね。
このタグだけですべてを追えるとは限らないかもしれませんが、多くの人が関わってるプロジェクトで誰がリソースを変更しているのかを追うことができます。

カスタムタグについて

環境変数を使用して、ユーザーが定義したタグを付与することが可能です。

export YOR_SIMPLE_TAGS='{"team": "devops", "env": "prod"}'

下記のように一括でタグ付けを行えます。

$ yor tag -d .
  __    __
  \ \  / /
   \ \/ /___  _  ____
    \  /  _ \| |/  __|
    | |  |_| |   /
    |_|\____/|__|v0.1.133
 Yor Findings Summary
 Scanned Resources:       4
 New Resources Traced:    3
 Updated Resources:       0

New Resources Traced (3):
+---------+----------+---------+-----------+--------------------------------------+
|  FILE   | RESOURCE | TAG KEY | TAG VALUE |                YOR ID                |
+---------+----------+---------+-----------+--------------------------------------+
| ec2.yml | EIP      | env     | prod      | 3d3b65b6-a9b2-423a-84e2-04d736caf936 |
+         +          +---------+-----------+                                      +
|         |          | team    | devops    |                                      |
+         +----------+---------+-----------+--------------------------------------+
|         | IAMRole  | env     | prod      | cf9c2468-54d3-4abc-9eec-bf5cac5b3aef |
+         +          +---------+-----------+                                      +
|         |          | team    | devops    |                                      |
+         +----------+---------+-----------+--------------------------------------+
|         | EC2      | env     | prod      | 9e8c124f-a8e0-48ec-9830-1d62c40fc3fe |
+         +          +---------+-----------+                                      +
|         |          | team    | devops    |                                      |
+---------+----------+---------+-----------+--------------------------------------+

YAMLの設定ファイルを使用することで、git_modifiersによって所属チームを記したタグを付与するなど柔軟にタグ付けを実施できます。
下記のようなファイルを作成して、--config-fileで参照することで利用可能です。

tag_groups:
  - name: ownership
    tags:
      - name: team_ownership
        value:
          default: sre
          matches:
            - security_engineering:
                tags:
                  git_modifiers:
                    - xxx
                    - yyy
            - platform_engineering:
                tags:
                  git_modifiers:
                    - aaa
                    - bbb

パイプラインへの埋め込み

本格的に使用していくならパイプラインに埋め込む必要があると思います。
git commitを行った後にYorを実行して再度git commitしないといけないため面倒ですし、Yorの適用し忘れも発生させてしまう可能性が高いです。
下記ブログで紹介されているようにYorをインストールして簡単にGithub Actions等のCI/CDパイプラインへ埋め込むことが可能です。

最後に

まだまだ書き方によっては動かなかったりしたので本格的にパイプラインに組み込むような段階では無いかなと思いましたが、トレーサビリティを高める考え方は面白いと思いました。
DevSecOpsに注力しているBridgecrew社の最新OSSなので注視したいと思います!