CloudFormationのテンプレートをYAMLで書く場合、JSONのポリシーをYAMLに変換する


はじめに

CloudFormationのテンプレートをYAMLで書いていて、テンプレートにIAMポリシーを書く場合のお話です。

IAMポリシーはJSONで書かれているので、テンプレートをYAMLで書いているならIAMポリシーをYAMLに変換したい

公式ドキュメントはもちろんのこと、リソースとして作成されたIAMポリシーはJSONで書かれています。

よって、テンプレートをYAMLで書いているなら、IAMポリシーもYAMLで書きたいところです。それで、JSONで書かれたIAMポリシーがあり、それをYAMLのテンプレートに書く場合には、JSONをYAMLに変換するツールを利用すると良いです。

また、先にAWS管理コンソールでIAMポリシーを作り、そのJSONを元にYAMLに変換するのも良いと思います。IAMポリシーを作るのに、AWS管理コンソールは便利です。既存のAWS管理ポリシーを取り込みながら新たなポリシーを作ることが出来ますし、一からポリシーを組み立てる場合でも「サービスを選択→アクションを選択→リソースを指定」といったことをGUIで出来ます。こういった用途だったら、AWS管理コンソールを使った方が楽だと思います(最初からコードとして書いたほうが早いというケースもあると思いますから、その辺は状況に応じて)。

そして、実際に作ったJSONのIAMポリシーをYAMLに変換して、テンプレートに書こうということです。

JSONをYAMLに変換する方法と注意点

JSONをYAMLに変換する方法はいくつかあります。ここでは以下の方法について取り上げてみます。

  • ネット上のサービスを利用する
  • json2yamlパッケージを利用する(Python)
  • yqパッケージを利用する(Python)
    • jqコマンドのラッパーなので、jqコマンドのインストールが必要

このうち、ネット上のサービスは手軽なのは良いのですが、ポリシー内にAWSアカウントIDやS3バケット名など、自分達の環境固有の値やリソース名などが記述されている場合は利用を控えたほうが無難だと考えています。AWS外のサイトにそのような情報を送信すること自体が危うい行為になりかねないということです。

「いくつかあるネット上のサービスのうち、どれが危険でどれが危険ではないか」という話ではなく、「環境固有の値やリソース名などが載っているIAMポリシーを『AWS外』のサービス上に送信する」という行為自体を控えることが望ましい、という意味です。

なお、公式ドキュメントや信頼できるメディアなどで公開されているIAMポリシーを変換するような用途であれば、ネット上のサービスを利用しても良いと思います。

使用するサンプル

簡単な見本として、以下のJSONを使います。

sample.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "*"
        }
    ]
}

json2yamlパッケージを利用する

Pythonを使える環境でしたら、json2yamlを使う方法があります。

インストール方法

$ pip install json2yaml

使用方法

JSONをYAMLに変換

量が少なければ標準出力にそのまま表示させ、それをコピーすれば良いと思います。

$ json2yaml sample.json
Version: '2012-10-17'
Statement:
- Effect: Allow
  Action:
  - s3:Get*
  - s3:List*
  Resource: '*'

YAMLに変換したファイルを作成したい場合は、以下のとおりです。

$ json2yaml sample.json sample.yaml

YAMLをJSONに変換

json2yamlのパッケージをインストールすると、YAMLをJSONに変換するyaml2jsonもインストールされます。

$ yaml2json sample.yaml
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "*"
        }
    ]
}

JSONに変換したファイルを作成したい場合は、以下のとおりです。

$ yaml2json sample.yaml sample.json

yqパッケージを利用する

JSONを扱うjqのラッパーとして、yqというラッパーがあります。

もしjqがインストールされていなかったら、先にjqをインストールします。

jqのインストール

Ubuntu(20.04.4 LTSで確認)

$ sudo apt update
$ sudo apt install jq

CentOS Stream

# dnf install jq

yqのインストール

$ pip install yq

使用方法

JSONをYAMLに変換

$ yq -y '.' sample.json
Version: '2012-10-17'
Statement:
  - Effect: Allow
    Action:
      - s3:Get*
      - s3:List*
    Resource: '*'