はじめに
Cloudformation (以下Cfn)のテンプレファイルをCLIコマンドでデプロイする時に
は「cloudformation deploy」が使用候補となると思います。
このコマンドはローカルに存在するファイルが51200バイトを超えると、
ローカルからデプロイができない仕様があります。
本記事は上記容量を超過したテンプレファイルをデプロイする方法探し、見つけるまでの悩みの経緯記載した記事となります。
結論
オプションコマンドとS3を経由することで「cloudformation deploy」の実行が可能
■コマンド例
aws cloudformation deploy --s3-bucket {S3バケット名} --template-file {ローカルに存在するテンプレファイルパス} --stack-name {スタック名}
確認経緯
導入
私:以下コマンドを使ってローカルにあるCfnテンプレートをデプロイしたいけどファイルサイズが上限を超えてエラーになる。。
テンプレテートを分割して2回に分けてデプロイするしかないか。。
aws cloudformation deploy --template-file {ローカルに存在するテンプレファイルパス} --stack-name {スタック名}
①「とりあえず検索」
私:同じ悩みを持つ人いないかググったら開発者に機能リクエストしてる人がいたわ、、
最後の回答でオプション「--s3-bucket」を使えば解消できたって書かれてるし単純にオプション付与で行けるっぽいのかな
Allow aws cloudformation deploy to use template-url #2461
②「AWS CLIリファレンスの確認」
私:そうならAWS CLIリファレンスから確認やな!
解消済みの要望みたいだし「--s3-bucket」オプション探そ!!
--s3-bucket (string) The name of the S3 bucket where this command uploads your CloudFormation template. This is required the deployments of templates sized greater than 51,200 bytes
■和訳
--s3-bucket(文字列) このコマンドが CloudFormation テンプレートをアップロードする S3 バケットの名前。これは、51,200 バイトを超えるサイズのテンプレートのデプロイメントに必要です
私:あった!「アップロードするS3バケット」って表記は謎だけど、
予め格納されたテンプレファイルを指定するオプションって感じなのかな?
つまりは、格納先のバケットポリシーや実行元のIAMロールに気を付けつつ↓ならOKってことか!
aws cloudformation deploy --s3-bucket {S3バケット名orARN} --template-file {S3に格納したテンプレファイル名} --stack-name {スタック名}
■出力結果
Invalid template path {指定先S3の情報}
私:うーん、、権限回りもNW周りも見直したけど問題なさそうだし、
そもそも同じようなコマンド書いてる人が見つからないな、、
私:もう一回リファレンスを見直してみよう
--s3-bucket (string) The name of the S3 bucket where this command uploads your CloudFormation template. This is required the deployments of templates sized greater than 51,200 bytes
--s3-prefix (string) A prefix name that the command adds to the artifacts' name when it uploads them to the S3 bucket. The prefix name is a path name (folder name) for the S3 bucket.
■和訳
--s3-bucket(文字列) このコマンドが CloudFormation テンプレートをアップロードする S3 バケットの名前。これは、51,200 バイトを超えるサイズのテンプレートのデプロイメントに必要です
--s3-prefix(文字列) コマンドがアーティファクトを S3 バケットにアップロードするときにアーティファクトの名前に追加するプレフィックス名。プレフィックス名はS3バケットのパス名(フォルダー名)です。
私:「テンプレートをアップロードする S3 バケットの名前」 ってもしかして
コマンド実行時にローカルからS3にアップロードしてそのままデプロイされるってこと?
※今までの認識:S3に事前にテンプレを格納しておき、CLIコマンドでS3とS3に格納されたテンプレファイルを指定しデプロイ
新しい認識:ローカルに格納しているテンプレファイルを格納するS3をCLIコマンドで指定し、そのままデプロイ
③「コマンド修正の上、再度実行」
私:そうならこんな感じのコマンドかな
aws cloudformation deploy --s3-bucket {S3バケット名} --template-file {ローカルに存在するテンプレファイルパス} --stack-name {スタック名}
■出力結果
成功!!
私:ついでにS3内に格納されるテンプレファイルのプレフィックスを指定したい場合は、↓ってことかな
aws cloudformation deploy --s3-bucket {S3バケット名} --s3-prefix {格納先S3バケット内プレフィックス} --template-file {ローカルに存在するテンプレファイルパス} --stack-name {スタック名}
終わりに
どうせこんな作りでしょ?っていう考え方が邪魔して悩んでいました。
技術力も大事ですが、記載内容を理解する語学力のなさを痛感していました。
本記事が同じようにハマっている人の助けになれば幸いです。