AWS CloudFormationで管理しているAmazon Elasticsearch Serviceをダウンタイムなしでアップグレードする

こんにちは。サービスグループの武田です。AWS CloudFormationで管理しているAmazon Elasticsearch Serviceをダウンタイムなしでアップグレードする方法を試してみました。
2020.06.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

AWSが提供している全文検索サービスであるAmazon Elasticsearch Service(以下、ESS)はダウンタイムなしでのアップグレードをサポートしています。

手動でアップグレードする場合はこれでいいのですが、AWS CloudFormation(以下、CFn)で管理しているESSのアップグレードは知見がありませんでした。今回その方法を調べる機会がありました。

UpdatePolicyを指定すれば可能

まずは結論から。AWS::Elasticsearch::Domainで定義しているリソースにUpdatePolicyが指定できます。これにEnableVersionUpgrade: trueを指定すればダウンタイムなしでのアップグレードが可能です。

次のように定義してあるESSのリソースを例にします。

Domain:
  Type: AWS::Elasticsearch::Domain
  Properties:
    ElasticsearchVersion: '7.1'

これを次のように修正するだけでOKです。

Domain:
  Type: AWS::Elasticsearch::Domain
  Properties:
    ElasticsearchVersion: '7.4'
  UpdatePolicy:
    EnableVersionUpgrade: true

やってみた

修正したCFnテンプレートでスタックを更新してみます。するとアップグレードが始まります。

ドキュメントにも記載がありますが負荷の少ない時間帯に実施するのがよいです。一時的にCPUの負荷が上がっています。

短時間ですがKibanaにアクセスできないタイミングがありました。Webのエンドポイントは問題ありませんでした。

30分くらい待っていると無事にアップグレードが完了しました。

おまけ:CDKの場合

CDKでESSを管理している場合も同じようにUpdatePolicyを指定することになりますが、指定方法が最初はよくわかりませんでした。

const domain = new CfnDomain(this, 'Domain', {
  elasticsearchVersion: '7.1',
});

次のように指定すれば大丈夫でした。

const domain = new CfnDomain(this, 'Domain', {
  elasticsearchVersion: '7.4',
});

domain.cfnOptions.updatePolicy = {
  enableVersionUpgrade: true,
};

まとめ

マネージドサービスは便利ですね!