CloudFormationを使った環境構築、デプロイを行っているのだが、
テンプレートの中で、UserDataを使って、S3からコードを取得したり、環境にあわせて、設定ファイルを書き換えたりという処理を行っている。
このUserDataの中で、例えばS3からのデータの取得に失敗した場合どうなるの??
取得コマンドだけ書いているだけだと、そのまま処理は走り、Stackのステータスが「CREATE_COMPLETE」になってしまう。
つまり、デプロイ失敗したままコンプリートを迎えてしまうわけです。
これが、Blue-Green Deploy手法をとっている場合は、GreenのStackの生成を行い、正しく作成が成功しているのを見届けてから、BlueからGreenに切り替えるので、必ずGreenのチェックが入る。だから、そこまで影響はないと考えられる。あった方がいいけど。
しかし、動的にstackを立ち上げたり、stackを落としたりというシステムを作成した場合は、
人間の目のチェックが入らないところで、勝手に起動、削除が動いているので、エラーハンドリングは入れておきたい。
もしS3で取得失敗した場合等は、正しく「ROLLBACK_COMPLETE」になってほしい。
これを実現するためには、CloudFomationで用意されているヘルパー関数を利用する。
cfn-initとcfn-signalを利用します。
AWSの公式ドキュメントだと、以下がサンプルコード。
"MyInstance": { "Type": "AWS::EC2::Instance", "Metadata": { "AWS::CloudFormation::Init" : { cfn-init information } }, "Properties": { "ImageId" : "ami-12345678", "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackName" }, " -r MyInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? --stack ", { "Ref" : "AWS::StackName" }, " --resource MyInstance \n" ] ] } } }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT5M" } } } |
cfn-signalに「-e」オプションで「0」を与えると、正しく生成成功したことを意味し、それ以外を与えると、ロールバックしてくれます。
これで、エラーハンドリグができるので、突っ走って「CREATE_COMPLETE」にならないようにできます!
この記事を書いた人
- PM(プロダクトマネージャー)目指して奮闘中、プログラムから、アーキテクト設計、サービス検討から、チームマネジメント、DevOps、いろいろやってます。
最近書いた記事
- 2017.11.22Design Sprint in Yahoo! ロッジ
- 2017.11.21iOS11 HEIF、HEVCの新コーデック
- 2017.11.21SRE 〜サイトリライアビリティエンジニアリング〜
- 2017.10.31リーンキャンバスを実践してみよう