AWS
lambda

AWS Lambdaを環境変数を用いて実行する際に""次のことを実行する権限がありません: kms:DescribeKey.""と表示されてしまうので解消~~してみた~~しようとしたらハマった

AWS Lambdaを環境変数を用いて実行する際に""次のことを実行する権限がありません: kms:DescribeKey.""と表示されてしまうので解消してみたしようとしたができなかった

何を目的に、何をしたのか。(達成できてない場合は「できてません」も冒頭で)

Lambda関数で環境変数を用いたいのだが、環境変数にキーと値のペアを代入すると表題のエラーが発生してしまう。

image.png

エラーを解消して、環境変数を活用したい。

結論やわかったこと

どうやらKMSに対するアクセスには『キーポリシー』も必要らしい。

実際に行った事

検証①ポリシーの書き換えの依頼

AWSではアクセスの管理をポリシーを使って行っている。
エラーメッセージとともにAWS管理チームにポリシーの書き換えを依頼したところkms関連の権限をポリシーに追記してもらった。

"Effect": "Allow",
"Action": [
    "kms:xxxxxxxxx",
    "kms:Describe*",
    "kms:xxxxxxxxx"
]

しかし追記されたポリシーの中に

"kms:DescribeKey"

が存在していない。
管理部に再度依頼する必要がありそうであり優先度が一番高い。

しかし実行ロールには入っている。

{
  "roleName": "ロール名",
  "policies": [
    {
      "document": {
        "Version": "XXXXXXXX",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:XXXXXXXXxxx",

              "kms:DescribeKey", ここに入っている

              "kms:XXXXXXXXxxx"
            ],
            "Resource": "*"
          }
        ]
      },
      "name":関数名",
      "type": "inline"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "XXXXXXXX"
            ],
            "Resource": "*"
          },
          {
            "Effect": "Allow",
            "Action": [
              "XXXXXXXX"
            ],
            "Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
          }
        ]
      },
      "name": "XXXXXXXX",
      "id": "XXXXXXXX",
      "type": "XXXXXXXX",
      "arn": "arn:aws:iam::aws:policy/XXXXXXXX"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "XXXXXXXX",
            ],
            "Resource": "*"
          }
        ]
      },
      "name": "XXXXXXXX",
      "id": "XXXXXXXX",
      "type": "XXXXXXXX",
      "arn": "arn:aws:iam::aws:policy/XXXXXXXX"
    }
  ],
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]
}

元々管理部門に制作してもらったポリシーに関しては

kms:DescribeKey

は入っていなかった。ので、インラインポリシーにこの権限を追記して保存したところ実行ロールに入ったと思われる。

しかし実際に作成したポリシーをポリシー一覧から見てみると、ポリシーが認めるアクセス権限内にDescribeKeyが存在している。これは

インラインポリシーを外した状態でロールを実行してもポリシーシュミレーターでもallowedになっているので、もともと管理部が作成したポリシーではDescribeKeyの権限を与えている。

image.png

つまり実際の記法ではDescribeKeyは存在しないように見えるが、実際はrunしていることになる。
実際のポリシーとしてはDescribeKeyに対するアクセス権限を与えているのだが、実行するロールとしてはDescribeKeyを表示していない。

また、仮にDescribeKeyをインラインポリシーに追加して、Lambda関数上の実行ロールに表示しても実行できなかった。

検証②ロールに対するポリシーのアタッチができていない。

できていた。また、ユーザーグループに対してもアタッチはできており、自身もそのユーザーグループできている。

検証①②より

作成してもらったポリシーと,ロールに対するアタッチには問題がない様子。

他のエラーを当たる。

検証③versionが機能していない可能性

下記はアクセスが拒否されたときの公式ドキュメントである。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot.html

確認したところ、versionがポリシー内に記載されていないと変数が宣言されないとのこと。実際に確認したが、しっかり宣言されていた。

検証③デフォルトキーをそのまま使用しているケース

下記は環境変数を使用する際の公式ドキュメントである。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/env_variables.html

最初に環境変数を使う前提で関数を作成した場合と、関数を作成した後に環境変数を作成する場合では,使用するサービスキーが異なるらしい。

その際のエラーメッセージとして

Lambda was unable to configure access to your environment variables because the KMS key used is disabled. 
            Please check your KMS key settings.

が表示されるらしい。そもそもエラーメッセージが異なるかつ、デフォルトキー以外を選択しても同様に表題のエラーメッセージが出たので、これに関しては問題ない様子である。

検証④AWS Key Management Serviceを実行できていない

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/overview.html
暗号化する際に上記リンク内のKMSというサービスを活用する。

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/control-access-overview.html

上記はAWS KMSに対するアクセス権限が記載されている公式ドキュメントである。
これによると

AWS サービスで、IAM ポリシーはサービスのリソースへのアクセスを制御する唯一の方法です。一部のサービスでは、IAM ポリシーを補完するために、リソースベースのポリシーやその他のアクセスコントロールメカニズムを提供していますが、これらは通常オプションであり、IAM ポリシーでのみ、これらのサービスのリソースへのアクセスを制御できます。

現在はKMSに対するアクセスをポリシーでのみ制御している。

しかしAWS KMS については該当しません。KMS CMK にアクセスを許可するには、キーポリシーを単独で、または IAM ポリシーや許可と組み合わせて使用する必要があります。IAM ポリシー単独では、CMK へのアクセスを許可するのに十分ではありませんが、CMK のキーポリシーと組み合わせて使用することができます。

ここではポリシーとは別に、キーポリシーも用意する必要がありそうである。

では実際にキーポリシーを用意してみる。
下記はキーポリシーの利用に関する公式ドキュメントである。
https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/key-policies.html

頭の中でこうなっていた。
image.png

しかしドキュメントによると下記のイメージ

image.png

どうやらロールに対するポリシーの付与のみでなく、CMKに対してもポリシーを付与する必要があるらしい。

一度KMSについてまとめてみる。

結論やわかったことに対する補足

AWSは独自用語がとても多く、ドキュメントの読み込みに時間がかかる。

後日判明した解決方法

KMSに対するアクセスにはIAMポリシーとキーポリシーが必要であった。
キーポリシーを作成することでエラーが解消した。

やり方は下記参照。

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/create-keys.html