LoginSignup
1
0

【AWS-CloudForamation】Yaml記述の基礎知識

Last updated at Posted at 2023-11-23

擬似パラメータ

AWS CloudFormationでは、定義しなくても使用できる擬似パラメータ存在する。

  1. AWS::Region: スタックがデプロイされているAWSリージョンを取得します。

    MyBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: !Sub "my-bucket-${AWS::Region}"
        # 例:ap-northeast-1
    
  2. AWS::StackName: スタックの名前を取得します。スタック内で一意です。

    MyBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: !Sub "my-bucket-${AWS::StackName}"
    
  3. AWS::StackId: スタックの一意のIDを取得します。

    MyBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: !Sub "my-bucket-${AWS::StackId}"
    
  4. AWS::AccountId: AWSアカウントのIDを取得します。

    MyBucketPolicy:
      Type: "AWS::S3::BucketPolicy"
      Properties:
        Bucket: !Ref MyBucket
        PolicyDocument:
          Statement:
            - Effect: "Allow"
              Principal:
                AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
              Action: "s3:GetObject"
              Resource: !Sub "arn:aws:s3:::${MyBucket}/*"
    

これらの擬似パラメータは、テンプレート内で情報を動的に取得したり、リソースを一意に識別したりするのに役立ちます。

関数

!Ref関数 (Reference 参照)

  1. リソース名の参照:
Resources:
  MyBucket:
    Type: "AWS::S3::Bucket"

Outputs:
  BucketName:
    Value: !Ref MyBucket

この例では、MyBucketというS3バケットを作成し、!Ref MyBucketを使用してその名前を取得しています。

  1. パラメータの参照:
Parameters:
  Environment:
    Type: String
    Default: "Production"

Resources:
  MyInstance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: "t2.micro"
      ImageId: "ami-12345678"
      Tags:
        - Key: "Environment"
          Value: !Ref Environment

ここでは、Environmentというパラメータの値を!Ref Environmentを使ってEC2インスタンスのタグに設定しています。

  1. 条件付きリソースの参照:
Parameters:
  CreateResource: 
    Type: String
    AllowedValues: ["Yes", "No"]
    Default: "Yes"

Resources:
  MyResource:
    Type: "AWS::SomeResourceType"
    Condition: ShouldCreateResource
    Properties:
      # リソースの設定

Conditions:
  ShouldCreateResource: !Equals [!Ref CreateResource, "Yes"]

この例では、CreateResourceパラメータに基づいて条件付きでリソースを作成し、!Ref CreateResourceを使ってその値を条件として参照しています。

!Sub関数 (Substitution 置換)

!Sub関数は文字列内で変数やリソースの属性を置換するために使用する。

  1. 変数の置換:
Parameters:
  Environment:
    Type: String
    Default: "Production"

Resources:
  MyBucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Sub "my-bucket-${Environment}"

この例では、!Sub関数を使ってBucketNameEnvironment変数を埋め込んでいます。

  1. リソース属性の置換:
Resources:
  MyInstance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-12345678"
      UserData: !Sub |
        #!/bin/bash
        echo "Instance ID: $(curl http://169.254.169.254/latest/meta-data/instance-id)" > /tmp/instance-info

この例では、!Sub関数を使ってUserDataスクリプト内でEC2インスタンスIDを含む文字列を生成しています。

  1. 複数の変数の組み合わせ:
Parameters:
  ProjectName:
    Type: String
    Default: "MyProject"
  Environment:
    Type: String
    Default: "Production"

Resources:
  MyBucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Sub "${ProjectName}-${Environment}-data-bucket"

この例では、!Sub関数を使ってBucketNameProjectNameEnvironment変数を組み合わせています。

!Sub関数はこれらのようにしてテンプレート内で動的な文字列を生成するのに便利です。

!GetAtt関数 (Get Attribute 属性情報の取得)

!GetAtt関数は、CloudFormationテンプレート内でAWSリソースの特定の属性を取得するために使用されます。

  1. リソース属性の取得:
Resources:
  MyLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: arn:aws:iam::123456789012:role/execution_role
      FunctionName: my-function

Outputs:
  FunctionArn:
    Description: Lambda Function ARN
    Value: !GetAtt MyLambdaFunction.Arn

  Runtime:
    Description: Lambda Function Runtime
    Value: !GetAtt MyLambdaFunction.Runtime

    # !GetAtt 論理ID.属性情報

この例では、AWS Lambda関数 MyLambdaFunction のARN(Amazon Resource Name)とランタイムを取得しています。ここで:

  • !GetAtt MyLambdaFunction.Arn はLambda関数のARNを取得します。
  • !GetAtt MyLambdaFunction.Runtime はLambda関数のランタイムを取得します。

このように、各リソースはそのリソースタイプに固有の属性を持ちます。Lambda関数の場合、ArnRuntimeはその属性の例です。お使いのAWSサービスによっては、取得できる属性が異なるため、AWSの公式ドキュメントを参照してください。

!Join関数

Join関数は、AWS CloudFormationテンプレート内で文字列を連結するために使用される関数です。Joinを使うと、指定したデリミタを使って複数の文字列を一つの文字列にまとめることができます。
*デリミタ(Delimiter)は、文字列やデータを区切るための記号や文字(ex.コンマ)

以下はJoin関数を使用してリスト内の文字列をコンマで連結する例です。

!Join
  - ","
  - - "Item1"
    - "Item2"
    - "Item3"

Fn::Join:
  - ","
  - - "Item1"
    - "Item2"
    - "Item3"

上記の例では、"Item1,Item2,Item3"という文字列が生成されます。最初の引数がデリミタ(,)、次の引数が連結したい文字列のリストです。

Join関数は、テンプレート内で動的に文字列を生成する場合や、リソース名やタグの生成など、様々な場面で利用されます。

1
0
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
0