2018年1月25日

AWS CloudformationをAWS CLIから使ってみる

Share

公式ドキュメント

基本的な使い方

事前準備

実行パス設定

$ CF_PATH=file://~/cfsample

AWS CLIのprofileを指定(複数設定している場合)

必要に応じて、AWS CLIのprofileを指定

確認方法は、

cat ~/.aws/credentials
cat ~/.aws/config

必要に応じて設定する

export AWS_DEFAULT_PROFILE=XXXXX

共通項目の設定

ここでは、

  • serviceというタグにsampleと設定する
  • 共通のprefixとしてcfsample-をつける
$ CF_TAG_KEY=service
$ CF_TAG_NAME=sample
$ CF_STACK_NAME_PREFIX=cfsample-

サンプル

サンプルとして、S3にsampleのbucketを作成してみる

S3.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: "Cloudformation Sample : Create Sample S3 Bucket"
Parameters:
  pStackNamePrefic:
    Description: "Common stack name prefix"
    Type: String
    Default: ""
  pBucketName:
    Description: "Bucket Name"
    Type: String
Resources:
  Bucket:
    Type: "AWS::S3::Bucket"
    DeletionPolicy: Retain
    Properties:
      BucketName: !Ref pBucketName
      AccessControl: Private
      VersioningConfiguration:
        Status: Suspended
      Tags:
        - Key: Name
          Value: !Ref pBucketName
  BucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Version: "2012-10-17"
        Id: BucketPolicy
        Statement:
          - Sid: 1
            Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub
              - arn:aws:s3:::${sb}/*
              - { sb: !Ref Bucket }
            Principal:
              AWS: !Join
                - ""
                - - "arn:aws:iam::"
                  - !Ref AWS::AccountId
                  - ":root"
Outputs:
  BucketName:
    Value: !Ref Bucket
    Export:
      Name: !Join
          - ""
          - - !Ref pStackNamePrefic
            - BucketName
  BucketDomainName:
    Value: !GetAtt
        - Bucket
        - DomainName
    Export:
      Name: !Join
          - ""
          - - !Ref pStackNamePrefic
            - BucketDomainName
  BucketWebsiteURL:
    Value: !GetAtt
        - Bucket
        - WebsiteURL
    Export:
      Name: !Join
          - ""
          - - !Ref pStackNamePrefic
            - BucketWebsiteURL

テンプレートをAWS Cloudformation Designerで確認する。

こんな感じです。

cloudformation

作成(create-stack)

Reference : create-stack

  • CloudFormationのStackの名前(CF_STACK_NAME)
  • 定義ファイル指定(CF_FILE_NAME)
  • パラメータ指定(定義ファイル内で仕様)
    • pStackNamePrefic
    • pBucketName
$ CF_STACK_NAME=SampleBucket
$ CF_FILE_NAME=S3.yaml
$ aws cloudformation create-stack \
--tags Key=${CF_TAG_KEY},Value=${CF_TAG_NAME} \
--stack-name ${CF_STACK_NAME} \
--template-body ${CF_PATH}/${CF_FILE_NAME} \
--parameters \
ParameterKey=pStackNamePrefic,ParameterValue=${CF_STACK_NAME_PREFIX} \
ParameterKey=pBucketName,ParameterValue="techteco.sample.bucket" \
| jq .

結果

{
  "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXXXXX:stack/sampleBucket/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

一覧表示(list-stacks)

Reference : list-stacks

$ aws cloudformation list-stacks \
--region ap-northeast-1 \
--stack-status-filter CREATE_COMPLETE \
| jq -r .StackSummaries[].StackName

結果

sampleBucket

表示(describe-stacks)

Reference : describe-stacks

$ aws cloudformation describe-stacks \
--stack-name ${CF_STACK_NAME} \
| jq .

結果

{
  "Stacks": [
    {
      "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXXXX:stack/sampleBucket/XXXXXXXXXXXXXXXXXXXXXXXXXX",
      "StackName": "sampleBucket",
      "Description": "Cloudformation Sample : Create Sample S3 Bucket",
      "Parameters": [
        {
          "ParameterKey": "pStackNamePrefic",
          "ParameterValue": "cfsample-"
        },
        {
          "ParameterKey": "pBucketName",
          "ParameterValue": "techteco.sample.bucket"
        }
      ],
      "CreationTime": "2018-02-01T14:53:26.062Z",
      "RollbackConfiguration": {},
      "StackStatus": "CREATE_COMPLETE",
      "DisableRollback": false,
      "NotificationARNs": [],
      "Outputs": [
        {
          "OutputKey": "BucketName",
          "OutputValue": "techteco.sample.bucket",
          "ExportName": "cfsample-BucketName"
        },
        {
          "OutputKey": "BucketDomainName",
          "OutputValue": "techteco.sample.bucket.s3.amazonaws.com",
          "ExportName": "cfsample-BucketDomainName"
        },
        {
          "OutputKey": "BucketWebsiteURL",
          "OutputValue": "http://techteco.sample.bucket.s3-website-ap-northeast-1.amazonaws.com",
          "ExportName": "cfsample-BucketWebsiteURL"
        }
      ],
      "Tags": [
        {
          "Key": "service",
          "Value": "sample"
        }
      ],
      "EnableTerminationProtection": false
    }
  ]
}

その他

全部は確認しきれてませんが、AWSのコンソールから出来ることの多くは実現できそうです。