背景
Lamdaのリソースを作成するためにterraform planを実行したとき、roleの値についてエラーになった。
なぜerrorになったのかがわからずIAM周りの知識が曖昧だったため調べたことをまとめつつ解決していく。
結論
""がついてたからデータを代入できなかった(凡ミス)
resource "aws_lambda_function" "devtime-prod-app-lambda" {
function_name = "devtime-prod-app-lambda"
- role = "aws_iam_role.devtime-prod-app-lambda.arn"
+ role = aws_iam_role.devtime-prod-app-lambda.arn
エラーが出てしまいました...おそらくECRにイメージをまだpushしてないのでURIを取得できずエラーになったんですかね。このエラーはCDをを作成した時に解消します。
Error: creating Lambda Function (devtime-prod-app-lambda): operation error Lambda: CreateFunction, https response error StatusCode: 400, RequestID: c72af30d-f483-4be4-8f3c-47fd8bf5283b, InvalidParameterValueException: Source image 022544359532.dkr.ecr.ap-northeast-1.amazonaws.com/devtime-prod-app-ecr is not valid. Provide a valid source image.
なぜLambdaにsts:AssumeRoleのaction権限を付与しないといけないのか?`
AssumeRoleを実行するのはLambda Entity。Lamda EntityはデフォルトでIAMロールがアタッチされている。
そのIAMロールをAssumeRoleアクションを実行して関数実行時にattachしないといけないから。(解釈が違うかもしれない)
roleとpolicyの違い
policy > roleの関係があると思っていたが違うっぽい。
roleとpermission勘違いしてた。roleはIDでpolicyはpermissionsのオブジェクト。
Lamdbdaの実行ロールとは
awsのサービスおよびリソースにアクセスする許可を関数に付与するIAMロール
つまりLambdaを実行したときにawsのリソースにアクセスするかどうかで設定するかしないかが決まるということ?
内部的に実行するアクションがあるため、sts:AssumeRoleなどの権限の付与が必要だった。
AsuumueRoleとは
AssumeRoleとはAWS STSのサービスの1機能のこと
stsとは
AWSサービスに対して何かしら操作したい時に一時的に操作する権利(Token)を発行するサービス
信頼ポリシー
異なるEntity間の認証(違うと思うがこの前提で理解する。) → IAMロールを引き受けることのできるエンティティを定義する。後で図で書きたい。
Permissions boundary
実行できるアクションに境界を設定(delete権限に特定のリソースしかdeleteできないようにするなど)
アイデンティティベースポリシー
実行できるアクションを定義(permission)
PassRole
awsサービスにIAMロールをアタッチするときに必要な権限
感想
記事というよりかは10行ぐらいで調べたことをまとめたものを書こうと思ったが、
思ったよりもlamdaの実行ロールというものは深いものだった。
記事を書くというのを目的にするとなかなか手がつかないが、スコープを最小に絞ってまとめるのは継続しやすいからいい。いい。
参考文献
(まず最初に見た記事)
(体系的に理解するために見た記事)