こんにちは、SREグループの水戸 (@y_310) です。前回の記事でも触れたとおりMoTにはたくさんのサービスが稼働しており、それに応じて様々なインフラリソースも作成されています。そのためリソースの見通しを良くし、インフラ構築時に迷わず命名できるようにするために色々な命名規則を定めています。
命名規則はその組織が置かれている状況や直面している課題によって何を優先するかも異なり絶対的に正しい方法は無いと考えているため、この記事を読んだ方がご自分の状況と照らし合わせて取捨選択の判断がしやすいようにそれぞれの命名規則を決めた理由と合わせて紹介していきます。
MoTではサービス名に 世界の一単語の都市名 (市町村名)をつけることをルールとしています。これはいわゆるコードネームですが、このサービス名をベースに後述の関連するリソース名も設定することになります。 以下が具体例です。
またこれらのルール以外にガイドラインとして、以下のようなものがあります。
サービス名として一般的にはそのサービスの機能や役割を示す名前をつけることが多いかと思います (前述の例におけるtaxi_dispatcherなど)が以下の理由によりあえてその選択を避けています。
また、一単語の都市名 (市町村名)を選択している理由は以下です。
なおこのルールを導入する場合、名前からは役割を一切推測できないため、社内では全サービスの名前と概要を記載した一覧表を作成しています。
AWS上に作成するリソースはまず基本原則として全て小文字でkebab-caseで命名することとしています。これは主にS3の命名規則に従うためです。
具体的なリソース名には以下の命名規則を設定しています。
resource-service[-descriptors]-environment-number[-az-number]
resource: リソースの種類
service: サービス名
descriptors: 任意の数のサービスを説明する名前 (同じ種類のAWSリソースを用途に応じて複数作る場合等に使用)
environment: 環境(development|staging|productionなど)
number: 3桁の連番 (移行等で同名のリソースを複数作る必要が出た時のため)
az-number: 1桁のAZの連番 (サブネットのようにAZ毎に同じものを複数作る場合)
リソース種類の表記 | AWSサービス名 |
---|---|
role | IAMロール |
ec2 | EC2 |
sqs | SQS |
rds | RDSインスタンス |
eip | Elastic IP |
rdsclstr | RDSクラスタ |
vpc | VPC |
policy | IAMポリシー |
実際に規則を適用した例としては以下のようになります。
# シンプルなケース
policy-london-development-001
policy-london-production-001
# 同じ種類のリソース(SQS)を複数作成するケース (*-priorityがdescriptors)
sqs-london-high-priority-production-001
sqs-london-low-priority-production-001
# DBマイグレーションのために同名で複数のインスタンスを作るケース
rdsclstr-london-staging-001
rdsclstr-london-staging-002
# 複数のAZに同名のサブネットを作るケース
subnet-london-development-001-0
subnet-london-development-001-1
名前を構成する各コンポーネントの目的については規則内で既に説明をつけたためここではその順序について説明します。ただしそもそものところになりますが、名前の一意性を保つのに十分な要素が含まれている事が重要なので、順序については相対的に重要度が下がる問題にはなります。
まず全体として名前はそのリソースの固有性をより表現できる部分から先につけるようにしています。
先頭にリソース種別(rds, sqsなど)を付けているのはIAMポリシー内やアプリケーションの設定内など他の場所からそのリソースを参照する際にそれが何であるのかを分かりやすくする目的があります。
次にサービス名とdescriptors(london, london-high-priorityなど)を付けています。AWSマネジメントコンソール上などリソースが大量に並ぶ画面でも先頭のリソース種別とサービス名の組み合わせで目的のリソースをほぼ一意に特定できるためサービス名をこの順序にしています。また同じサービスのリソースが連続して並ぶので見やすいという観点もあります。
次の環境(development, productionなど)は、オペミスの観点では重要度の高い情報で、先頭につける方式もあり迷うところではあったのですが、基本的にリソースは全てTerraformでコード管理していて環境見間違いによる誤操作のリスクがあまり高くないことや、リソース種別を先頭に置くことのわかりやすさを優先したかったことからこの順序にしています。またAWSアカウントごと分けている環境では不要という考え方もできますが、現実には既存環境で分けられなかったり、アカウント横断してリソース名をスプレッドシートに列挙したりなどアカウント横断でも一意性がある方が扱いやすいこともあるのでアカウント管理方法に関わらず付けたほうが良いと考えています。
残りの番号(001, 001-0など)についてはそもそも先頭に置けないことや重要度が低いことから末尾に配置しています。
アカウント名については様々な用途で作成されることから現状複雑なルールは設定していません。
アカウント名の命名規則は以下です。
mot-[任意の名前]-aws
先頭のmotは冗長ではあるのですが、将来的に会社が成長し別組織のアカウントを管理するような事が発生した場合に備えて組織の区別ができるように含めています。
末尾のawsも同じく一見冗長なのですが、MoTではGCPのプロジェクトも大量にあり、時折AWSアカウントと同名でGCPにもプロジェクトを作成したいケースがあるため、区別しやすいようにクラウドサービス名を含めています。
最後に命名規則を定める目的を整理したいと思います。
チームの認識を合わせ一定のルールを決めることは簡単なことではありませんが、決めて運用して得られるメリットはそれより遥かに大きいと感じています。この記事で書いた命名規則はあくまで一例でチームの置かれている状況によって最適解は変わると思いますが、この記事の内容がルールを定める上での議論の叩き台になれば幸いです。
興味のある方は 採用ページ も見ていただけると嬉しいです。
Twitter @mot_techtalk のフォローもよろしくお願いします!