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、いろいろやってます。