[AWS/IaC] Former2によるCloudFormation/Terraformテンプレートの自動出力方法

AWSアカウント内の既存のリソースから、IaCテンプレート(CloudFormation/Terraform)を自動で作成するツールの活用方法と手動で改修すべき範囲についてのメモ

1. Former2の概要

Former2

  • Former2
    • ブラウザで動くWebアプリ
    • サードパーティ製のツール
      1
      Former2では、AWSアカウント内の既存のリソースからInfrastructure-as-Codeの出力を生成することができます。AWS JavaScript SDKを使用して関連するコールを行うことで、Former2はインフラストラクチャをスキャンし、出力を生成するリソースのリストを表示します。
    • CFnテンプレートだけでなく、Terraform等も出力可能
      • CloudFormation
      • Terraform
      • Troposphere
      • CDK (Cfn Primitives) - TypeScript, Python, Java, C#
      • CDK for Terraform - TypeScript
      • Pulumi - TypeScript
      • Diagram - embedded version of draw.io
    • CloudFormerと比較して高機能で2021年現在主流になっている
    • 価格はOSSのため無料
      1
      Former2はローカルでのアクセスや利用は無料ですが、一部のAWSサービスではAPIコールに関連して少額の料金が発生するため、AWSの利用料金に数セント余分に加算される可能性があります。
    • 出力したCFn Templateを汎用的にするには少し手直しが必要であった
      • ex. 固定値のパラメータを入力値を参照するように変更、formerでテンプレートに取り込めない細かいリソースの追記
    • 使用方法は二つ
      • Webアプリとして使用
      • セキュリティの関係でローカルホスティングしたい場合は、自分で動作環境を準備してそこで動かば良い

2. (Former2動作環境の起動)

3. Former2 Setup

3.1. Introduction

Former2 Introduction

  • ブラウザにプラグインを導入

    • Install Former2 Helper for Google Chrome
      Former2 Google Chrome Plugin
  • Continue to Credentialsを押下

3.2. Credentials

Former2 Credential

事前にReadOnlyAccessを付与したIAM UserとAccess Key/Secret Access Keyの用意が必要

  • IAM UserのCredentialを入力

    • Access Key ID
    • Secret Access Key
  • Credentialを正しく認識できたら、以下が表示される

    1
    Logged in as: <IAM User Name>@<AWS Account>
  • 公式説明

    1
    2
    リクエストを認証するには、IAM キーのペアが必要です。リソースを直接インポートすることを計画していない場合は、これらの資格情報で読み取りアクセスのみを提供し、
    ReadOnlyAccessポリシーを割り当てることをお勧めします。インポート機能を使用する予定がある場合は、スタックを作成するために適切な権限を付与する必要があります。
  • Continue to Parametersを押下

3.3. Parameter

Former2 Parameter

  • 独自のCloudFormation Parameterを設定する事ができる
    • 特になければスルー
1
オプションとして、以下にCloudFormationスタックのパラメータを追加することで、独自のCloudFormationスタックパラメータを含めることができます。デフォルト値が設定されている場合、値が一致していれば、出力でこれらのパラメータを参照するために !Ref または !Sub を使用することができます。
  • Continue to Settingsを押下

3.4. Settings

  • CFnテンプレートを出力するだけであればデフォルトでもOK

    • 設定後にGo to Dashboardを押下
  • CloudFormation Spacing

    • 出力のスペース数を変更
  • Logical ID Strategy

    • 論理ID名の付け方を設定
  • Default Output

    • 出力言語の設定
    • デフォルトではCloudFormation
    • ここで、TerraformやCDK, Draw.ioのDiagram等に変更可能
  • Irrelevant Resources

    1
    有効にすると、この設定は無関係とみなされるリソースをスキップします(現在はCloudWatchログストリームのみ)
  • Enable Related Resources

    • 関連リソースを有効化
  • Add All Resources

    1
    以下のボタンを使用して、スキャンしたすべてのリソースを出力に追加します(非推奨)
  • Save / Load Settings

    1
    すべての設定されたパラメータと設定(資格情報を除く)を含むファイルを保存またはロードします。
  • Programming Language

    1
    CDKやPulumiの出力プログラミング言語の好みを変更してください。
  • Default Resources

    1
    この設定を有効にすると、デフォルトのVPCやそのサブネットなどのデフォルトのリソースが含まれます。

以上でセットアップは完了

4. Former2によるテンプレートの出力

テンプレートに含めたいリソースを選択していく

  • Former2のDashboardからサービスを選択

Former2 Dashboard

  • 表示されたオブジェクトから、テンプレート化したいリソースを選択

  • +Add Selected

  • 関連するリソースがタブでまとまっており、直感的に操作できる
    Former2 Select Objects

  • Generate Template

    • オブジェクトの追加完了後に、Generate
    • CFnテンプレートが出力される
    • オブジェクト追加時に確認出来なかった項目も反映されていた
      • ex. tag

generate template

5. Former2で出力されるテンプレートについて

  • Former2では、一部CFnテンプレートに含まれない情報を見受けられた
  • また、各Propertyが固定された状態で出力されてしまうため、汎用的なテンプレートにするには入力値(Properties)の設定が必要になる

例とするPF構成

  • 以下のPF構成をformer2でテンプレート化したケースを考える
    • S3 Bucket
      • アプリをホスティング
    • CloudFront Distribution
      • S3 Bucketをソースとしてアプリを配信
    • AWS WAF
      • CloudFrontにアタッチ
      • アクセスを制限

出力したCFn Temlateに含まれない情報/注意点

  • s3 bucket

    • LifecycleConfiguration
      • Rules
        • Id指定のみで、ルール自体はCFn Templateに取り込めていなかった
        • 別アカウントでテンプレートを実行する場合は同名のルールが無いためエラーになってしまうと思われる
        • ライフサイクル未指定であれば無関係
  • WAFに関する注意点

    • CloudFront用に設定したWAFのリソースはGlobal(CloudFront)として扱われる
    • former2では画面右上のボタンでリージョンを選択するが、Globalが無い
    • 調査したところ、リージョンをUS East(N. Virginia)に設定することで確認可能であった
      • US East(N. Virginia)で生成される仕様になっていため、former2の画面右上のボタンでリージョンを変更するだけで良い

汎用的なテンプレートにするには

  • Parametersで各固定値を自由に設定可能な入力値に変更する

    • CFn Template実行時の入力値としてユーザが設定可能なパラメータを規定できる
      • テンプレートが汎用的に利用可能になり、別Projectやアカウントでも使い回し可能になる
    • 各パラメータには以下を定めることで利便性を高めることができる
      • Description
        • 説明を定義
      • 初期値とバリデーションも定義できる
        • 参考となるような名称を予め定めておくことで、Templateの利便性が高まる
    • 記載例
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      Parameters: # 入力値を定義 
      BucketName:
      # CFn実行時に入力欄に表示されるユーザ向けの説明
      Description: Please write bucket name
      # デフォルト値
      Default: sample-bucket #
      # 入力値のタイプ
      Type: String
      XXXXName:
      ...
  • 各リソースのPropertiesの各項目から入力値(Parameters)を参照する

    • !RefでParametesで定めた入力値を参照できる
    • 入力値の規定/参照例
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      Parameters: # 入力値を定義 
      BucketName:
      # CFn実行時に入力欄に表示されるユーザ向けの説明
      Description: Please write bucket name
      # デフォルト値
      Default: sample-bucket #
      # 入力値のタイプ
      Type: String
      ...
      Resources: # 生成するResourceを定義
      S3Bucket:
      Type: "AWS::S3::Bucket"
      Properties:
      BucketName: !Ref BucketName # 入力値を参照
  • 入力値の参照にはRefを用いる

    • 指定した論理IDのパラメータやリソースを参照する
      1
      !Ref <PropertyName>
      CloudFormationRef
  • Subを使うと変数と文字列を組み合わせられる?

  • !Subを活用すると、入力値と固定値を組み合わせることができる

    • 名称の一貫性や、入力の手間の省力化を見込める
    • 書式
      1
      2
      3
      !Sub "${PJName}-Bucket"
      !Sub "${PJName}-Policy"
      ...

所感

  • Former2で出力したテンプレートの活用方法

    • そのまま固定値で使用しても構わないが、他のPJでも使いまわせる汎用的なテンプレートにするには、paramaterで変数化する必要がある。CFnの記法については最低限知識が必要
  • CFnに精通したメンバがいない場合は、以下の流れでIaC化を図ると良さそう

    1. 0から無理にCFnテンプレを作らず、コンソールやCLIで検証しながらPFを構築
      • 初級者が0からCFnテンプレを書くと細かい内容でハマってしまう(実体験)
    2. ある程度定まってからFormer2で固定値のテンプレートを出力
    3. 固定値を変数化
    4. 以降はCFnテンプレートとGitでPFを管理していく
  • テンプレートの分割について

    • 大規模なPFの場合はテンプレートを分割して、他のテンプレートと入れ子構造にした方が良い
      • Former2でホスティング環境/IAM関連/運用監視関係と分割してテンプレートを出力することで、管理が円滑になる
    • 分割テンプレートを連携させるには、パラメータの受け渡しなどの手間が増えるため、CFnの知識がある程度必要

参考

関連記事

その他

@EventEmitter @Input @Output @ViewChild ACM AMP API Gateway AR AR.js AR.js Studio AWS AWS Amplify AWS Budgets AWS Cost Explorer AWS SDK for JavaScript AddThis Adobe XD Alexa Amazon CloudWatch Amazon Honycode Amazon SNS Android Angular Angular Material AngularFire AppSync Augury C CDN CI/CD Cloud Craft Cloud9 CloudFormation CloudFront CloudTrail Cognito Cost Anomaly Detection Cubase ai Cubasis LE DTM Disqus DynamoDB Elgato HD 60S Firebase Firebase Hosting Former2 Github Github Actions Github.com GithubEnterprise GithubPages Google Chrome Google Cloud Shell GraphQL Hexo Hosting IAM Ionic JSON JavaScript LadioCast Logging LowCode MFA MS Authentication MacBook Pro 16 Mind Node NETDUETTO Netflix Party Netlify Network NoCode Observable PO PdM Promise RPA ReactiveForm Recognition Route53 S3 SAM(Serverless Application Model) SAR SSL SYNCROOM Schematics ScrumInc Serverless Service Siri Sitemap Spark AR Steinberg UR44C Teams Touch Cast Studio Treetable TypeScript UI UI Bakery WAF WAFv2 WEB Page Dev WEB会議 WebAR WebSocketAPI Webhook Windows Power Automate Wireshark aot async/await aws config cloud9 display.land draw.io e2e test filter() forkJoin() google search console hexo-generator-amp iOS iPad Pro iPhone icarus map() mat input mat tree mat-checkbox mat-input mat-selection-list mmhmm ngFor plantUML popIn Aladdin2 then() vscode ”global is not defined” らくがきAR アジャイル アジャイル開発 クロスプラットフォーム ショートカット スクラム スクラム開発 テレワーク ファイル操作 ブラウザ型IDE プロダクトオーナー プロダクトマネージャー プロトタイピング リモートセッション 共同開発 双方向データバインディング 待ち合わせ処理 認定スクラムマスター 静的WEB Hosting 静的WEBサイトHosting
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×