1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【IaC超入門】30日でAWS CloudFormationとTerraformをマスターするロードマップ - 7日目: CloudFormationの便利な機能:パラメータとOutputs

Posted at

CloudFormationの便利な機能:パラメータとOutputs

はじめに

前回はCloudFormationテンプレートを使って、簡単なS3バケットをデプロイしましたね。しかし、あのテンプレートはS3バケット名が固定されていて、再利用が難しいものでした。今回は、テンプレートをより柔軟で再利用可能にするための重要な機能、パラメータ(Parameters)とOutputsについて詳しく解説します。

1. パラメータ(Parameters)とは

パラメータは、テンプレートのデプロイ時にユーザーが値を指定できるようにする機能です。これにより、テンプレートのコード自体を変更することなく、異なる環境(開発、ステージング、本番など)や設定(インスタンスタイプ、バケット名など)に対応できます。

パラメータのメリット

  • テンプレートの再利用性向上:一つのテンプレートで複数の環境に対応
  • 設定の柔軟性:デプロイ時に動的に値を変更可能
  • 入力検証:許可される値の制限やデフォルト値の設定が可能
  • 保守性の向上:環境固有の値をテンプレートから分離

パラメータの定義と利用例

Parametersセクションでパラメータを定義し、Resourcesセクションで!Ref関数を使ってその値を利用します。

以下のテンプレートは、スタック作成時にS3バケット名と環境名を入力できるようにしています。

AWSTemplateFormatVersion: "2010-09-09"
Description: "This template creates an S3 bucket with configurable names and settings."

Parameters:
  EnvironmentName:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - staging
      - prod
    Description: "The name of the environment (dev, staging, or prod)"
    ConstraintDescription: "Must be one of: dev, staging, prod"

  BucketNamePrefix:
    Type: String
    Description: "The prefix for the S3 bucket name (e.g., myapp, data-lake)"
    MinLength: 3
    MaxLength: 20
    AllowedPattern: "^[a-z0-9-]*$"
    ConstraintDescription: "Must be 3-20 characters, lowercase letters, numbers, and hyphens only"

  EnableVersioning:
    Type: String
    Default: "false"
    AllowedValues:
      - "true"
      - "false"
    Description: "Enable versioning for the S3 bucket"

Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub "${BucketNamePrefix}-${EnvironmentName}-${AWS::AccountId}-${AWS::Region}"
      VersioningConfiguration:
        Status: !If [EnableVersioningCondition, Enabled, Suspended]
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      Tags:
        - Key: Environment
          Value: !Ref EnvironmentName
        - Key: ManagedBy
          Value: CloudFormation

Conditions:
  EnableVersioningCondition: !Equals [!Ref EnableVersioning, "true"]

Outputs:
  BucketName:
    Description: "The name of the created S3 bucket"
    Value: !Ref MyS3Bucket
    Export:
      Name: !Sub "${AWS::StackName}-BucketName"
  
  BucketArn:
    Description: "The ARN of the created S3 bucket"
    Value: !GetAtt MyS3Bucket.Arn
    Export:
      Name: !Sub "${AWS::StackName}-BucketArn"
  
  BucketDomainName:
    Description: "The domain name of the S3 bucket"
    Value: !GetAtt MyS3Bucket.DomainName
    Export:
      Name: !Sub "${AWS::StackName}-BucketDomainName"

パラメータの詳細設定

上記の例では、以下の検証機能を使用しています:

基本的な制約

  • MinLength/MaxLength:文字列の最小・最大長
  • AllowedValues:許可される値のリスト
  • AllowedPattern:正規表現による入力パターンの制限
  • ConstraintDescription:制約に違反した場合のエラーメッセージ

パラメータの参照方法

  • !Ref ParameterName:パラメータの値を直接参照
  • !Sub "${ParameterName}-suffix":文字列置換を使った動的な値の生成

2. Outputsとは

Outputsは、スタックのデプロイ後に作成されたリソースの情報を出力する機能です。例えば、作成したS3バケット名やEC2インスタンスのパブリックIPアドレスなどを、スタックの外部から参照できるようになります。

Outputsのメリット

  • 情報の可視化:作成されたリソースの詳細を確認可能
  • 他のスタックとの連携:Export機能で他のスタックから参照可能
  • 自動化の促進:CI/CDパイプラインでの値の取得が容易
  • トラブルシューティング:リソースの物理IDや設定値を簡単に確認

Outputsの活用シーン

1. 他のスタックからの参照

Exportを使用することで、他のスタックからFn::ImportValue関数で値を参照できます。

# 別のスタックでの参照例
Resources:
  MyLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Environment:
        Variables:
          BUCKET_NAME: !ImportValue MyS3Stack-BucketName

2. アプリケーション設定への利用

デプロイされたリソースの情報をOutputs経由で取得し、アプリケーションの設定ファイルに自動で反映させることが可能です。

# AWS CLIを使ってOutput値を取得
aws cloudformation describe-stacks \
  --stack-name MyS3Stack \
  --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' \
  --output text

3. 実践的な使用例

パラメータファイルの活用

複数の環境で同じテンプレートを使用する場合、パラメータファイルを作成すると便利です。

dev-params.json

[
  {
    "ParameterKey": "EnvironmentName",
    "ParameterValue": "dev"
  },
  {
    "ParameterKey": "BucketNamePrefix",
    "ParameterValue": "myapp-data"
  },
  {
    "ParameterKey": "EnableVersioning",
    "ParameterValue": "false"
  }
]

prod-params.json

[
  {
    "ParameterKey": "EnvironmentName",
    "ParameterValue": "prod"
  },
  {
    "ParameterKey": "BucketNamePrefix",
    "ParameterValue": "myapp-data"
  },
  {
    "ParameterKey": "EnableVersioning",
    "ParameterValue": "true"
  }
]

AWS CLIでのデプロイ

# 開発環境へのデプロイ
aws cloudformation create-stack \
  --stack-name myapp-s3-dev \
  --template-body file://s3-template.yaml \
  --parameters file://dev-params.json

# 本番環境へのデプロイ
aws cloudformation create-stack \
  --stack-name myapp-s3-prod \
  --template-body file://s3-template.yaml \
  --parameters file://prod-params.json

4. ベストプラクティス

パラメータのベストプラクティス

  1. 適切なデフォルト値を設定:最も一般的な値をデフォルトに
  2. 制約を適切に設定:入力ミスを防ぐための検証を追加
  3. 分かりやすい説明を記述:ユーザーが理解しやすいDescription
  4. 命名規則の統一:PascalCaseを使用(例:EnvironmentName)

Outputsのベストプラクティス

  1. Export名の命名規則${AWS::StackName}-OutputName形式を推奨
  2. 必要な情報のみ出力:セキュリティ上重要でない情報のみ
  3. 分かりやすい説明:出力値の用途を明確に記述
  4. 複数の形式で出力:Name、ARN、URLなど用途に応じて複数出力

5. トラブルシューティング

よくあるエラーと対処法

パラメータ制約エラー

Parameter validation failed: Parameter value 'TEST' does not match pattern '^[a-z0-9-]*$'
  • 解決策:AllowedPatternの正規表現に合致する値を入力

Export名の重複エラー

Export MyStack-BucketName is already exported by stack other-stack
  • 解決策:Export名をユニークにするか、既存のスタックを削除

まとめ

機能 役割 使い方 主な用途
パラメータ テンプレートに動的な値を与える Parametersセクションで定義し、!Ref!Subで利用 環境別設定、再利用性向上
Outputs 作成したリソースの情報を出力 Outputsセクションで出力値を定義 他スタック連携、設定値確認

パラメータOutputsを組み合わせることで、テンプレートは単なる静的な設計図から、様々な環境に対応できる強力なツールへと進化します。これにより、インフラのコードを再利用し、管理の効率を大幅に向上させることができます。

また、Conditions(条件分岐)と組み合わせることで、さらに柔軟なテンプレートを作成することも可能です。

次回は、CloudFormationでEC2インスタンスをデプロイしてみましょう。S3バケットよりも複雑な設定が含まれるため、より実践的な内容になります。お楽しみに!

参考リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?