Memo/AmazonWebServices/CloudFormation

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/CloudFormation
 

CloudFormation


StackSets: 複数のAWSアカウント、複数リージョンのリソースを一度のオペレーションで操作

    • 同時アカウントの最大数:1、20アカウントを対象に一つIAM roleを作る場合。約13分かかった。
  • 注意点
    • 複数アカウント、複数リージョンで完全に同じリソースを作成。例: IAM role。
    • テンプレートはなるべく固有値を入れずに、パラメータとしてStackSet実行時に与えるようにする。例:AssumeRole時のAccountId
    • パラメータに、アカウント毎やリージョン毎に固有の値を値を入れる方法は不明。例えば、「bucket-account01」「bucket-account02」等。リソースIDは擬似パラメーター参照 - AWS CloudFormationで参照できる。また、組み込み関数で出来る事に限られそう。
    • S3 bucket作成はglobalリソースで重複できないので、 AWS::AccountId, AWS::Region 等の疑似パラメータ参照を使い、任意のバケット名を作る。または、サンプル CloudTrailのように同一バケット内に AWS::AccountId のディレクトリを作って分ける。
      arn:aws:s3:::${TrailBucket}/AWSLogs/${AWS::AccountId}/*
    • デフォルトでは1アカウントで失敗すると、他のアカウントへの適用も失敗する。同時アカウントの最大数, 障害耐性) アクション > StackSetの詳細を編集で確認できる。
    • 手で作ったリソースがある場合、失敗する。手動で削除する必要がある。どうやって手動かCloudFormationが作成したかを判断しているのか?

CloudFormer: 既存のリソースをCloudFormationへ変換

  • VPCとcloudtrailだけを選択して出力した例
    {
      "AWSTemplateFormatVersion": "2010-09-09",
      "Resources": {
        "vpc6c2d5a0b": {
          "Type": "AWS::EC2::VPC",
          "Properties": {
            "CidrBlock": "172.31.0.0/16",
            "InstanceTenancy": "default",
            "EnableDnsSupport": "true",
            "EnableDnsHostnames": "true"
          }
        },
        "traildefault": {
          "Type": "AWS::CloudTrail::Trail",
          "Properties": {
            "IncludeGlobalServiceEvents": true,
            "IsLogging": "true",
            "S3BucketName": "cloudtrail-bucket-example"
          }
        },
        "dchpassoc1": {
          "Type": "AWS::EC2::VPCDHCPOptionsAssociation",
          "Properties": {
            "VpcId": {
              "Ref": "vpc****"
            },
            "DhcpOptionsId": "dopt-****"
          }
        }
      },
      "Description": ""
    }

Mappings: key, value変換

  • 例: AWS::Region マクロから、特定のAMI-IDを参照している
    AWSTemplateFormatVersion: "2010-09-09"
    Mappings: 
      RegionMap: 
        us-east-1:
          HVM64: ami-0ff8a91507f77f867
          HVMG2: ami-0a584ac55a7631c0c
        us-west-1:
          HVM64: ami-0bdb828fd58c52235
          HVMG2: ami-066ee5fd4a9ef77f1
    ...
    Resources: 
      myEC2Instance: 
        Type: "AWS::EC2::Instance"
        Properties: 
          ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]

ベストプラクティス


Drift: CloudFormation以外で行った操作の検出

  • CloudFormation > スタックを選択 > ドリフトの検出

テンプレート検証エラーの解決

  • awscliを使った検証。あくまで構文のチェックで、実行時にエラーが出る事もある。
    aws cloudformation validate-template --template-body file://cloudformation/example.yml --profile example
  • 「map keys must be strings; received numeric [10] instead」文字列が必要
    - Version: 2012-10-17
    + Version: "2012-10-17"

コスト見積

Stack毎に見積が出せる。


エディタ

yamlとjsonが使える。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-20 (火) 11:57:14 (3d)