目次

目次

CloudFormationの中で、UserData書きまくって、エラーハンドリングせずにノーガード戦法デプロイしていませんか?

にょこた
にょこた
最終更新日2016/12/26 投稿日2016/12/26

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

目次