cloudformationに必要なiamポリシーとか
試行錯誤でなんとかデプロイ達成。
まあ、ワイがIAMに始まりAWSを理解していないのがいけないのですが。
事の発端はgoバイナリをlambdaにデプロイしようと思ったこと。
2年前くらいにlambdaとApiGatewayをひいひい言いながら動かしたことがあるけど
それっきりで身についておらず苦労したことしか覚えてない。
というわけで何かないかググる。楽するために努力する。
と、cloudformationとかいうなんかすごそうなものを見つける。
少し前からあったらしいけど全然知らなかった。ので読む。
インフラをドキュメントで定義して管理しましょうね的なサービス。
そういえば弊社でもterraform使ってたような。
で使ってみることに。
①samを入れてinitする
②作りかけのgoを混ぜてtemplate.yamlをそれっぽく修正する
③awsコンソールから必要な権限を準備する
④sam package --s3-bucket 中間生成物用S3 --output-template-file packaged.yaml
⑤sam deploy --template-file packaged.yaml --stack-name {stack} --capabilities CAPABILITY_IAM
⑥失敗するとstackに情報が残るのでコンソールからチェックしたら消す
aws cloudformation delete-stack --stack-name {stack}
⑥成功すると(iamと)lambdaとapigatewayができてる
みたいな流れ。
って書くと簡単そうだけど②③でひたすら詰まる。
仕事後の貴重な自由時間3日分くらい。
詰まったポイント:
・samを実行するlinux(今回はlightsail)のiamに権限が必要
用意しておいたロールを使うときにはiam:GetRoleとiam:PassRoleが必要、
専用の権限を同時に作成する場合は7つくらい必要(後述)
・lambdaに紐づけるロールを用意してやると"lambdaにふさわしくない権限"と弾かれる
cloudwatch?lamdainvoke?昔の残骸を見ながら試すも無事死亡、あきらめる
で、cloudformationからのlambdaのiam生成に必要な権限はこちら(2019/08/23時点)
・iam:DetachRolePolicy
・iam:DeleteRolePolicy
・iam:DeleteRole
・iam:PutRolePolicy
・iam:AttachRolePolicy
・iam:GetRolePolicy
実はGetRoleも必要かも、試す気力がないです...
だいたいAdminでやるから意味のない情報かも。なぜワイはそうしなかったのか。
sam deployをする→failed→メッセージに"iam:~が必要です"と都度表示されるので
短気なワイは結構つらかった。
failedのときはrollbackしようとするのでそこでdeleteとかdetachが必要なのだけど、
その権限がないとrollbackに失敗するのでstackがしばらく残ってしまう。
stack1,stack2...とクソ命名をせざるを得なく、stack6で成功。
ググると2時間くらいほっといたら消えるらしい。
結局はlambdaにふさわしいロールの条件はわからず自動生成とした。
自動生成されたポリシーを見ると以下だった。
・AWSXrayWriteOnlyAccess
・AWSLambdaBasicExecutionRole
半分当たって半分外れ。Xrayって昔のlambdaのiamにいなかったぞ...
謎。知らなくても生きていけることはある。
template.yamlのメモ:
・outputはなくてもいい、awsのコンソールで値を見ることができる程度
エンドポイントURLとか作成されたロールを見れると便利
・公式サンプルが一番ためになった
github.com・ブラウザで雛形からある程度のtemplate.yamlを作成できるところがあるらしい
ここまで苦労しかなかったけど、やっぱコマンドでいろいろリソースを定義して
紐づけられるってすごい。
あと、sam local start-apiでテストができてしまうのもすごい。
苦労しただけのことはあると思いたい。
ああ、次は作りこみだ...