行く記憶の流れは絶えずして

戻ってこないのでメモするところ

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でテストができてしまうのもすごい。

苦労しただけのことはあると思いたい。

 

ああ、次は作りこみだ...