AWSインフラ命名規約

フューチャー株式会社

本コーディング規約は、世の中のシステム開発プロジェクトのために無償で提供致します。 ただし、掲載内容および利用に際して発生した問題、それに伴う損害については、フューチャー株式会社は一切の責務を負わないものとします。 また、掲載している情報は予告なく変更することがございますので、あらかじめご了承下さい。

1 免責事項

::: warning 有志で作成したドキュメントである

:::

2 前提条件

3 名前の構成要素

各リソースの名前に用いる要素を次の一覧に示す。

Category Item Name Usage
Common {env} 環境 環境の区別
{product} 製品名 構築する製品名またはシステム名。稼働するマイクロサービス名もこれに当たる
{role} 役割 役割を示す。場合によっては具体的な製品名 postgres, jenkins などを指定する
{usage} 用途 利用目的やリソースの動作 (action) を示す。user_master, fileupload など識別したい値を指定する
{target} 対象 操作の対象。usage が複数の対象があり区別したいときに利用する。
Network {region} リージョン リージョンコード の略称を用いる
{az} アベイラビリティーゾーン マルチ AZ 構成などで、明示的に AZ を意識する場合に用いる
{access} アクセス修飾子 access modifier. ネットワークでの public, private を区別したいときに利用する
{permission} 権限 allow または deny を指定する。Security Group での利用を想定
Organization {company} 会社名 会社の特定に利用。複数の会社による構築や、運用に複数社関わる場合などに必要となる
{project} プロジェクト プロジェクト制でプロダクトを開発する際のプロジェクト名または、プロジェクトコード

3.1 環境 ({env})

ソフトウェア開発では複数の環境を用意し、dev, stg, prod などの名前をつけて互いに完全に分離・区別する運用を行うことが多い。そういった環境分離のために AWS インフラは次のいずれか、もしくは組み合わせで設計される。

  1. 環境単位で AWS アカウントを作成する
  2. 環境単位で AWS リージョンを分ける
  3. 命名で分ける

いずれの方法でも、 各リソース名に環境名を付与することを推奨 する。冗長な命名となる場合もあるが、以下が理由である。

3.1.1 環境識別子

主要な環境名と識別子 (Identifier) は以下である。AWS リソースの命名には識別子を用いる。

Name Identifier Memo
Production prod エンドユーザーが使う環境、本番運用環境
Staging stg 本番と同じ構成でテストするための環境
User Acceptance Test uat ユーザーがシステムのレビュー、または操作を学習するための環境
Performance Test perf 性能検証を行うための環境
Development dev 開発チームが開発するための環境
Local local ローカル環境

prod についてはよく用いる dev, stg と見間違えを防ぐため 4 文字にしている。

デプロイメント環境 の考え方では、User Acceptance Test 環境を単にテスト環境 (Test) 呼ぶが、テストという単語は汎用的であるため複数の環境にあてはまる。したがって容易に認識齟齬が生じるため本規約では非推奨とする。

名前には必ず識別子を用いる。環境名をそのまま利用しない (例: production-example-s3bucket とは命名しない)。

理由:

3.1.2 同一目的の複数環境

同一目的の環境が複数必要な場合は、識別子の末尾に連番をつける。

例:

3.2 役割 ({role})

アプリケーションを構成する要素には役割がある。それを AWS リソース名に含めることで、開発者の理解を助け、操作ミスを低減する。

主要なロール名と識別子は以下である。

Name Identifier Memo
Web Server web apache や nginx などの Web サーバとしての役割
Web Application app Web アプリケーションとしての役割
Web API api HTTP(s) API を提供する
Job job 時間やある特定のイベントをもとにバックグラウンドの処理(バッチ処理など)を行う
I/F if ファイル入出力を行う
DB db データベース
Cache cache キャッシュ
CI/CD ci CI/CD サーバ

名前を一般化せず、プロダクト名をそのまま利用しても問題ない。例えば、Web アプリサーバに tomcat、CI/CD サーバに jenkins といった名称を使っても良い。

3.3 用途 ({usage})

利用目的やリソースの動作 (action) を示す。user_master, fileupload といった形式や、認証(auth)や BFF(Backend For Frontend)など。

役割 ({role}) と合わせてリソースが一意に特定できる名称を設定する。

3.4 リージョン ({region})

マルチリージョン構成を取り、リージョンを意識する必要のある場合に利用する。リージョンコード そのものではなく略称を識別子として用いる。

Name Region Code Identifier
米国東部 (バージニア北部) us-east-1 ue1
米国東部 (オハイオ) us-east-2 ue2
米国西部 (北カリフォルニア) us-west-1 uw1
米国西部 (オレゴン) us-west-2 uw2
アジアパシフィック (東京) ap-northeast-1 an1
アジアパシフィック (ソウル) ap-northeast-2 an2
アジアパシフィック (大阪) ap-northeast-3 an3
アジアパシフィック (シンガポール) ap-southeast-1 as1

シングルリージョン構成または、リージョン間のリソースの関係が疎である場合はリージョン識別子を付与しない。

3.5 アベイラビリティゾーン ({az})

AZ 名にはリージョンコードを含めず、末尾のアルファベットだけとする。

AZ ID Identifier
ap-northeast-1a a
ap-northeast-1c c
ap-northeast-1d d

3.6 アクセス修飾子 ({access})

VPC のサブネットは、パブリックサブネットの場合インターネットに直接アクセスできる。パブリックサブネットを区別したい場合はリソース名にアクセス修飾子を付与する。

Name Identifier
パブリックサブネット public
プライベートサブネット private

4 全体ポリシー

4.1 命名規約

次のように各要素を使ってケバブケース (kebab-case) で命名する。パスカルケース (PascalCase) やスネークケース (snake_case) は利用しない。なお、サービス名自体にパスカルケースを用いることは許容する

# 命名規約の基本形
{env}-{product}-{role}-{usage}

理由:

4.2 利用可能な文字

利用する文字は、半角英数字とハイフンに限定する。また、 小文字を推奨 する。

また、先頭文字には半角英字を用い (ハイフン、数値を先頭にしない)、ハイフンは 2 文字以上連続させないこととする。

4.3 AWS サービス名を含めない

リソース名に AWS サービス名を含めない。

良い例:

stg-fuga-web-fileupload
stg-fuga-web-fileupload

悪い例:

stg-fuga-web-fileupload-s3
stg-fuga-web-fileupload-bucket

理由:

Resource and data source arguments Do not repeat resource type in resource name (not partially, nor completely):

ただし、VPC エンドポイントやセキュリティグループのように、どの AWS サービスの何で利用されているかを示す場合には利用することがある。

4.4 プロジェクト名を含めない

プロジェクト制を取っている場合、その開発チームの持ち物であることを示すためプロジェクト名をリソース名に含めたくなるが非推奨である。

理由:

プロジェクト名の替わりにプロダクト名を含めることとする。

4.5 マルチクラウドを考慮し、aws 識別子を追加するかどうか

AWS だけではなく、Azure や GCP などを組み合わせたマルチクラウド運用を行っている、あるいは行う予定がある場合を考慮し、リソース名に aws といったプレフィックス/サフィックスを付与する考えもある。

本規約では、aws キーワードをリソース名に含めることは非推奨とする。

理由:

5 サービス別の命名規約

サービスによって異なる命名規約と例を記載する。

以下ではプロダクト名を fuga とした場合の例をあげる。

5.1 VPC

VPC に関わるリソースの命名について記載する。

Resource Name Naming Convention Example Note
VPC {env}-{product} stg-fuga
Subnet {env}-{product}-{access}-{az} stg-fuga-public-a AZ: どこのゾーンかを識別するため
EIP {env}-{product}-{usage} stg-fuga-nat
Route Table {env}-{product}-{access} stg-fuga-public
Internet Gateway {env}-{product} stg-fuga
NAT Gateway {env}-{product} stg-fuga
Endpoint {env}-{product}-{aws_service} stg-fuga-s3 様々なサービスが利用するため AWS サービス名を含めている
Security Group {env}-{product}-{aws_service}-{usage} stg-fuga-ec2-bastion 様々なサービスが利用するため AWS サービス名を含めている

5.2 API Gateway

AWS上の命名制約

API Gateway は 全体ポリシーの命名規約 に則る。管理上、一意となるように命名する

# 命名規約の基本形
{env}-{product}-{role}-{usage}-{access}

# 例
stg-fuga-web-portal-private
stg-fuga-web-fileupload-public

5.3 EC2

インスタンス名の制限=タグの制限のため、名前は Amazon EC2 リソースのタグ付け に従う必要がある。

# 命名規約の基本形
{env}-{product}-{role}

# 例
stg-fuga-web

オートスケーリング、オートヒーリング構成をする場合にどこの AZ に配置するかを意識させないため、リソース名に AZ は基本的に含めない。そのような構成をしないという方針は、アンチパターンのため構成を見直すべきと考える。

5.4 LB

AWS上の命名制約

LB には ALB/NLB/CLB などの種類があるが、いずれも以下の命名規約に従う。また、Internal LB に関しては、{usage} 部に含める。

# 命名規約
{env}-{product}-{role}-{usage}-{access}

# 例
stg-fuga-web-api-public

ターゲットグループ名は、基本的には LB と同じである。

ただし、Blue/Green デプロイを行う場合は、ターゲットグループ名をユニークにし、どちら (Blue/Green) に所属しているかをわかるようにする。

# Target group name (Blue/Green) の命名規約
{env}-{product}-{role}-{usage}-{access}-blue

# 例
stg-fuga-web-public-blue

5.5 ECS

AWS上の命名制約

ECS の命名規約は以下のとおりである

# クラスターの命名規約
{env}-{product}

# 例
stg-fuga

# サービスの命名規約
{env}-{product}-{role}-{usage}

# 例
stg-fuga-api-auth
stg-fuga-web-frontend

# タスク定義の命名規約
{env}-{product}-{role}-{usage}

# 例
stg-fuga-batch-import-address

5.6 Lambda

5.6.1 Lambda Function

AWS上の命名制約

CreateFunction によると以下の制約である。

Lambda は運用を経てリソース数が増えやすいサービスの一つである。そのため個別の機能名の前に {role} を含めてグルーピングしやすい名前にする。

# 命名規約
{env}-{product}-{role}-{usage}

# 例
stg-fuga-import-userprofile
stg-fuga-job-checkconsistency
stg-fuga-report-successrate

もし、Scatter-Gather パターンを用いる場合は次のようにサフィックスに追加して区別する。

# 命名規約
{env}-{product}-{role}-{usage}-scatter
{env}-{product}-{role}-{usage}-segment
{env}-{product}-{role}-{usage}-gather

5.6.2 Lambda Layer

AWS上の命名制約

Lambda Layers は実行環境が重要であるため、 {runtime} で言語バージョンを指定する。

# 命名規約
{env}-{product}-{runtime}-{usage}

# 例
stg-fuga-python310-auth
stg-fuga-nodejs18-frontend

5.7 RDS/Aurora

AWS上の命名制約

Amazon RDS の命名に関する制約 によると以下の制約である。

# クラスターの命名規約
{env}-{product}-{role}

# 例
stg-fuga-auth

# インスタンスの命名規約
{env}-{product}-{role}-{serial}

# 例
stg-fuga-auth-01

# DBパラメータグループの命名規約
{env}-{product}-{role}
{env}-{product}

# 手動スナップショットの命名規約
{env}-{product}-{role}-{yyyy}-{mm}-{dd}

AZ は含めない。

理由:

DB パラメータグループは、role 単位での設定を推奨する。product を跨いでの設定は行わない。

クラスター/インスタンスに適用する IAM ロール

DB サブネット

5.8 DynamoDB

AWS上の命名制約

Amazon DynamoDB でサポートされるデータ型と命名規則 によると以下の制約である。

DynamoDB のテーブル名には、環境、プロダクト名、用途を用いる。データは長く残り、かつ変更しにくいため会社名などの変化しやすい項目は含めない。

# DynamoDB の命名規約
{env}-{product}-{usage}

# 例
stg-fuga-user
stg-fuga-user-accesslog

なお、インデックス名は idx-1, idx-2 のような連番での管理を推奨する。RDB とは異なりアカウント単位での一意性は不要なため、テーブル名は含めなくても良いため、 idx_{テーブル名}_{連番} としなくても良い。DynamoDB は 最大で 20 のグローバルセカンダリインデックス を持つことができるが、インデックスの数は最小限に抑えることが鉄則であるため、0 埋めしない。ただし、要件上どうしても多用が避けられないことが判明している場合は idx-01, idx-02 と 0 埋めする。

5.9 S3 Bucket

AWS上の命名制約

Amazon S3 バケットの命名要件 によると以下の制約である。

S3 は非常に多くの用途で用いることがあるため、利用形態に応じて規則を変えて対応する。

# 通常の命名規約
{env}-{product}-{use}

# 例
stg-fuga-fileupload

# ログを保管するバケットの命名規約
{env}-{product}-{service}-logs

# 例
stg-fuga-alb-logs

# データ授受で利用する場合の命名規約
{env}-{product}-{use}-{dest}-if

# 例
stg-fuga-userinfo-fis-if

5.10 Kinesis Data Streams

AWS上の命名制約

CreateStream によると以下の制約である。

IoT のセンシングを始めとしたイベントデータの場合は、次の命名規約を用いる。{role} には import や export など、どのような処理を行うかを規定する。

設計によっては、データ種別 (スキーマ) 毎に分離することもあるため、デバイス名やセンサー名などの発生源の名前を持たせる。

# 命名規約
{env}-{product}-{role}-{usage}-{schema}

# 例
stg-fuga-import-iotsensor-devicetype
stg-fuga-import-iotsensor-toggle

ジョブキューとして用いる場合は、どのジョブを利用するかが重要であるため、呼び出し用であることが明確になるように命名する。

# 命名規約
{env}-{product}-call-{呼び出したいジョブ名}

# 例
stg-fuga-call-job-arrival-check

5.11 SQS

AWS上の命名制約

Amazon SQS キューとメッセージの識別子 によると以下の制約である。

1 つのキューに対し、複数のプロデューサー、コンシューマーを取りうるため、プロデューサー、コンシューマーを名前に含めることは推奨しない。

# 標準キューの命名規約
{env}-{company}-{product}-{usage}

# 例
stg-future-fuga-processresult

# FIFOキューの命名規約
{env}-{company}-{product}-{usage}.fifo

# 例
stg-future-fuga-processresult.fifo

5.12 Event Bridge Rule

AWS上の命名制約
# 命名規約
{env}-{product}-{usage}-{source}-{target}

# 例
stg-fuga-deploy-s3-codepipeline
stg-fuga-archive-auth0-s3
stg-fuga-polling-schedule-lambda

※スケジュールタイプのルールの場合は {source}schedule と記載する。

5.13 IAM

IAM に関わるリソースの命名について記載する。IAM グループ、IAM ユーザー、IAM ロール、IAM ポリシーの 4 点について述べる。

5.13.1 IAM ユーザー

IAM ユーザーについては、誰 (人またはシステム) が利用するのかを識別することを目的とする。同じユーザーを複数の人やシステムで使いまわすと、誰が操作したのかといった証跡を追えなくなってしまうため、個別に発行することを推奨する。 また、役割や権限といった情報は名前に含めない。そのような名前はユーザーに紐づけるロールが増えた際などに名前と役割や権限の実態が乖離してしまうためである。

IAM ユーザー名については全体ポリシーから外れ、アンダースコア区切りを推奨する。

理由:

人が利用する IAM ユーザー:

# 命名規約
{company}_{username}

# 例
future_taro_mirai

※AWS アカウントに関与する人が単一の会社に属する人だけである場合は {company}_ を省略しても良い。

システムが利用する IAM ユーザー:

# 命名規約
{product}_{usage}

# 例
fuga_api
fuga_auth0

AWS サービスに権限付与する場合は IAM ロールで付与することを想定している。システムが利用する IAM ユーザーは、別のクラウドや SaaS 等への権限付与に使うことを想定している。

全体ポリシーの命名規約 とは異なり、環境名 {env} を Prefix につけない理由は次である。

5.13.2 IAM グループ

IAM グループに IAM ユーザーを追加することで複数ユーザーの権限を一括管理できる。IAM ユーザーは複数の IAM グループに追加可能だが、所属可能なグループ数は最大で 10 という制約があるため注意が必要である。

この制約を踏まえ、各役職ごとに基本となるグループを作成し、基本グループで対応できない例外的な権限の付与を個別のグループで対応することを想定した命名としている。

また、グループ数をむやみに増やさないためにグループ名に環境名 {env} はつけない。仮に future-developer というグループが dev 環境のみにアクセスできるといったような制御をする場合でも、グループ名には dev をつけず、dev 環境にアクセス可能なポリシーをグループにアタッチする方針としている。

基本となるグループ:

# 命名規約
{company}-{role}

# 例
future-developer
future-maintainer

ここでの {role} はユーザーが担う役割を表す。

個別のグループ:

# 命名規約
{target}-{usage}

# 例
bastion-access

個別のグループは Session Manager で EC2 にアクセスするグループといった使い方を想定している。

例外的に特定のユーザーにのみ権限を付与する、会社を超えて共通のグループを付与するといったユースケースも考えられる。

5.13.3 IAM ロール

IAM ロールは、AWS サービスに権限を付与する目的で利用する。IAM ロールに複数の IAM ポリシーをアタッチできるため、IAM ロールの命名では細かい権限を表現することは避け、IAM ロールを誰が使うのかを明確にすることを主目的とする。

# 命名規約
{env}-{product}-{aws_service}-{usage}

# 例
stg-fuga-ec2-bastion
stg-fuga-lambda-api

※場合によっては {usage} 部に詳細情報を追加しても良い

5.13.4 IAM ポリシー

IAM ポリシーの命名に入る前に、ポリシーの設計方針について記載する。 ここでは、ポリシー設計方針の代表例として、以下の 2 パターンについて説明する。

それぞれの設計方針にはメリット・デメリットがあり開発規模などで使い分けが想定されるため、それぞれの場合の命名方法について記載する。

細かく設定する場合:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
# 命名規約
{env}-{product}-{permission}-{aws_service}-{usage}

# 例
stg-fuga-allow-s3-full
stg-fuga-allow-ses-send

特定のリソースに付与するポリシーを書き出す場合:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Action": ["ses:SendEmail", "ses:SendRawEmail"],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Action": "sqs:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
# 命名規約
{env}-{product}-{aws_service}-{usage}

# 例
stg-fuga-ec2-bastion
stg-fuga-iam-group-future-develop

IAM グループ用のポリシーを作成する例では、company を含めた future-develop といった名前を {usage} としている。

この場合は命名粒度が IAM ロールと等しくなるため、命名規約も同じ方針にしている。

予め用意されているポリシーの名前は PascalCase 形式であるが (例: AmazonS3FullAccess)、ユーザーが作成したことを明確にするため snake_case で命名する。

6 タグの命名

AWS上の命名制約

Tag naming and usage conventions によれば以下の制約である。

AWS リソースのタグ付け によれば、タグ付けのベストプラクティスは以下である。

より詳しいタグ付けのベストプラクティスも存在するが、本紙の範囲を超えるため紹介のみに留める。 https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html

6.1 タグキー

主要なタグ項目

Category Tag Key Required Note
Common Env 環境識別子
System システム名
Name リソースの識別子として機能名などを設定
費用按分 Owner リソースの管理主管部署。費用の負担先を想定
Project 開発担当チーム。どのチームがどれくらい利用したかをトレースするために設定
ツールで利用 StartAt 起動時刻。自動化ツールなどで必要があれば設定
EndAt 停止時刻

6.2 タグ値

6.3 タグポリシー

AWS Organizations を利用している場合、タグの標準化を促進するタグポリシーの設定が可能となる。 タグポリシーにより実現できることは以下。


7 License

CC-By-4.0