AWS Config(3)アクセスキーの管理と自動削除

アクセスキーの適切な管理

CIS AWS Foundations Benchmark というセキュリティガイドラインが公開されており、このガイドラインは、AWSアカウントをセキュアに保つために必要なAWSのセキュリティ設定を集めたベストプラクティス集として活用できる。

この CIS AWS Foundations Benchmarkでは、アクセスキーの取り扱いについて以下のように定めている。

  • 1.3 90 日間以上使用されていない認証情報は無効にします
  • 1.4 アクセスキーは 90 日ごとに更新します

この CIS AWS Foundations Benchmark準拠していないアクセスキーCloudWatch EventsLambda を用いて 自動削除 するために以下の設定を行う。

  1. 上記のポリシーに準拠しているか AWS Config を用いて定期的にチェックを行う
  2. 非準拠であった場合には、CloudWatch EventsLambda自動起動する
  3. Lambda非準拠のアクセスキーを削除する

1. AWS Configの有効化

AWS Configを有効化する手順については、こちら

2. AWS Configを用いた定期チェック

アクセスキーのチェックには、あらかじめAWS Configに用意されている access-keys-rotated マネージドルールを使用する。CIS AWS Foundations Benchmark で奨励されているアクセスキーの有効期限は、マネージドルール内の InputParameters で設定する。アクセスキーがこの条件を満たしていない場合、このリソースはルールに 非準拠(NON_COMPLIANT) であると判定される。

なお、この Config Rule を設定する前に ConfigurationRecorder を生成しておく必要がある。そこで、DependsOn 属性に ConfigurationRecorder リソースを設定している。

Resources:
  ConfigIamAccessKeysRotated:
    DependsOn:
      - ConfigConfigurationRecorder
    Type: 'AWS::Config::ConfigRule'
    Properties:
      ConfigRuleName: access-keys-rotated
      Description: アクティブなアクセスキーが、maxAccessKeyAge で指定された日数内にローテーションされるかどうかを確認します。
      InputParameters:
        maxAccessKeyAge: 90
      Source:
        Owner: AWS
        SourceIdentifier: ACCESS_KEYS_ROTATED

3. CloudWatch Events を用いた Lambda の自動実行

Configルールに 非準拠(NON_COMPLIANT)となった場合に、これを修復するLambdaを発火させるためのトリガとして、CloudWatch Events を設定する。

Resources:
  CloudWatchEventsForConfigIamAccessKeysRotated:
    Type: 'AWS::Events::Rule'
    Properties: 
      Description: CloudWatch Events about Config IAM Access Keys Rotated.
      EventPattern:
        source:
          - aws.config
        detail-type: 
          - Config Rules Compliance Change
        detail:
          messageType:
            - ComplianceChangeNotification
          newEvaluationResult:
            complianceType:
              - NON_COMPLIANT
      Name: AWS_Config
      State: ENABLED
      Targets:
        - Arn: !GetAtt LambdaDeleteExpiredAccessKeys.Arn
          Id: lambda

4. Lambda を用いた アクセスキー の削除

Lambdaが受け取るConfigから通知されたメッセージには、期限切れのアクセスキーを持つIAMユーザの情報が含まれる。そこでLambdaは、このユーザが持つアクセスキーのうち、有効期限を超過したアクセスキーのIDを探し当てDeleteAccessKey API を用いてこれを削除する。

また、AWS::Lambda::Permission リソースタイプを用いて、前述のCloudWatch Eventsが、このLambdaを実行可能とする権限を設定する。

Resources:
  LambdaDeleteExpiredAccessKeys:
    Type: 'AWS::Lambda::Function'
    Properties:
      Code:
        ZipFile: |
          import boto3
          import datetime
          import time
          import logging

          logger = logging.getLogger()
          logger.setLevel(logging.INFO)

          def lambda_handler(event, context):
              logger.info(str(event))
            
              if 'detail' in event:
                  detail = event['detail']
                  if 'configRuleName' in detail:
                      # access-keys-rotated
                      if detail['configRuleName'] == 'access-keys-rotated':
                          iam = boto3.client('iam')
                          users = iam.list_users()
                          for user in users['Users']:
                              if detail['resourceId'] == user['UserId']:
                                  access_keys = iam.list_access_keys(
                                      UserName=user['UserName']
                                      )
                                  for access_key in access_keys['AccessKeyMetadata']:
                                      create_date = access_key['CreateDate'].timestamp()
                                      now = time.time()
                                      if now - create_date > 60*60*24*90:
                                          response = iam.delete_access_key(
                                              UserName=user['UserName'],
                                              AccessKeyId=access_key['AccessKeyId']
                                          )
      Description: 有効期限が過ぎたアクセスキーを削除します
      FunctionName: deleteExpiredAccessKeys
      Handler: index.lambda_handler
      MemorySize: 128
      Role: !GetAtt IAMRoleForLambda.Arn
      Runtime: python3.7
      Tags:
        - Key: !Ref TagKey
          Value: !Ref TagValue
      Timeout: 3
      TracingConfig:
        Mode: Active
  LambdaDeleteExpiredAccessKeysPermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !Ref LambdaDeleteExpiredAccessKeys
      Principal: events.amazonaws.com
      # DO NOT write 'SourceAccount' option.
      SourceArn: !GetAtt CloudWatchEventsForConfigIamAccessKeysRotated.Arn

以上で、CIS AWS Foundations Benchmark に非準拠のアクセスキーを削除することができた。

Amazon GuardDuty(1)GuardDutyの概要

GuardDutyとは

Amazon GuardDuty は、VPC フローログAWS CloudTrail イベントログDNS ログ を分析して、悪意のある操作や不正な動作を継続的にモニタリングする脅威検出サービス。AWS 環境内の予期しない潜在的に未許可なアクティビティや悪意のあるアクティビティを識別して、AWS アカウントとワークロードを保護を行う。

検出結果

潜在的に悪意のある予期しないアクティビティを検出すると、GuardDuty によって結果が生成される。またこれらの結果は、GuardDuty のマネージメントコンソールから閲覧できるだけでなく、 CloudWatch Events を利用して表示することもできる。

検出した脅威は以下のタイプに分類される。

タイプ 重要度 内容
Backdoor:EC2/Spambot EC2 インスタンスが ポート 25 でリモートホストと通信 して通常と異なる動作を示す。
Backdoor:EC2/C&CActivity.B!DNS EC2 インスタンスは、既知のコマンド&コントロールサーバーに関連付けられるドメイン名をクエリ している。
Backdoor:EC2/DenialOfService.Tcp EC2 インスタンスが、TCP プロトコルを使用したサービス拒否 (DoS) 攻撃の実行に利用されている可能性がある。
Backdoor:EC2/DenialOfService.Udp EC2 インスタンスが、UDP プロトコルを使用したサービス拒否 (DoS) 攻撃の実行に利用されている可能性がある。
Backdoor:EC2/DenialOfService.Dns EC2 インスタンスが、DNS プロトコルを使用したサービス拒否 (DoS) 攻撃の実行に利用されている可能性がある。
Backdoor:EC2/DenialOfService.UdpOnTcpPorts EC2 インスタンスが、TCP ポートで UDP プロトコルを使用したサービス拒否 (DoS) 攻撃の実行に利用されている可能性がある。
Backdoor:EC2/DenialOfService.UnusualProtocol EC2 インスタンスが、異常なプロトコルを使用したサービス拒否 (DoS) 攻撃の実行に利用されている可能性がある。
Behavior:EC2/NetworkPortUnusual EC2 インスタンスが 通常と異なるポート でリモートホストと通信している。
Behavior:EC2/TrafficVolumeUnusual EC2 インスタンスがリモートホストに対して通常と異なる 大量のネットワークトラフィック を生成している。
CryptoCurrency:EC2/BitcoinTool.B!DNS EC2 インスタンスは、 暗号通貨 関連のアクティビティに関連付けられているドメイン名をクエリしている。
CryptoCurrency:EC2/BitcoinTool.B EC2 インスタンスは、 暗号通貨 関連のアクティビティに関連付けられている IP アドレスをクエリしている。
PenTest:IAMUser/KaliLinux API が Kali Linux EC2 インスタンスから呼び出されました。
PenTest:IAMUser/ParrotLinux API が Parrot Security Linux EC2 インスタンスから呼び出されました。
PenTest:IAMUser/PentooLinux API が Pentoo Linux EC2 インスタンスから呼び出されました。
Persistence:IAMUser/NetworkPermissions プリンシパルが、通常 AWS アカウントの セキュリティグループ、ルート、ACL のネットワークアクセス許可を変更 するために使用される API を呼び出した。
Persistence:IAMUser/ResourcePermissions プリンシパルが、通常 AWS アカウントのさまざまなリソースの セキュリティアクセスポリシーを変更 するために使用される API を呼び出した。
Persistence:IAMUser/UserPermissions プリンシパルが、通常 AWS アカウントの IAM ユーザー、グループ、ポリシーを追加、変更、削除 するために使用される API を呼び出した。
Policy:IAMUser/S3BlockPublicAccessDisabled バケットの Amazon S3 ブロック パブリックアクセスが無効 になった。
Policy:IAMUser/RootCredentialUsage API が ルート認証情報を使用 して呼び出された。
PrivilegeEscalation:IAMUser/AdministrativePermissions プリンシパルが 許容度の高いポリシーを割り当て ようとしている。
Recon:EC2/PortProbeUnprotectedPort EC2 インスタンスの 保護されていないポートを既知の悪意のあるホストが探している
Recon:EC2/PortProbeEMRUnprotectedPort EMR クラスタの 保護されていないポートを既知の悪意のあるホストが探している
Recon:IAMUser/TorIPCaller API が Tor 出口ノード の IP アドレスから呼び出された。
Recon:IAMUser/MaliciousIPCaller.Custom API が カスタム脅威リストにある IP アドレス から呼び出された。
Recon:IAMUser/MaliciousIPCaller API が既知の 悪意のある IP アドレス から呼び出された。
Recon:EC2/Portscan EC2 インスタンスがリモートホストに アウトバウンドポートスキャン を実行している。
Recon:IAMUser/NetworkPermissions プリンシパルが、通常 AWS アカウントの既存のセキュリティグループ、ACL、ルートの ネットワークアクセス許可を検出 するために使用される API を呼び出した。
Recon:IAMUser/ResourcePermissions プリンシパルが、通常 AWS アカウントのさまざまなリソースに関連付けられた アクセス権限を検出 するために使用される API を呼び出した。
ResourceConsumption:IAMUser/ComputeResources プリンシパルが、通常 EC2 インスタンスなどの コンピューティングリソースを起動 するために使用される API を呼び出した。
Stealth:IAMUser/S3ServerAccessLoggingDisabled バケットの Amazon S3 サーバーアクセスログ記録が無効 になった.
Stealth:IAMUser/PasswordPolicyChange アカウントの パスワードポリシーが弱化 された.
Stealth:IAMUser/CloudTrailLoggingDisabled AWS CloudTrail の証跡が無効化 されている。
Stealth:IAMUser/LoggingConfigurationModified プリンシパルが、通常 AWS アカウントの CloudTrail ログ記録の停止、既存ログの削除 、その他アクティビティの痕跡を消去するために使用される API を呼び出した。
Trojan:EC2/BlackholeTraffic EC2 インスタンスは、ブラックホール と呼ばれるリモートホストの IP アドレスに通信しようとしている。
Trojan:EC2/DropPoint EC2 インスタンスは、マルウェア によって収集された認証情報やその他の盗難されたデータによって認識されているリモートホストの IP アドレスに通信しようとしている。
Trojan:EC2/BlackholeTraffic!DNS EC2 インスタンスは、ブラックホール IP アドレスにリダイレクトされるドメイン名へのクエリを実行している。
Trojan:EC2/DriveBySourceTraffic!DNS EC2 インスタンスは、Drive By Download 攻撃 の既知のソースであるリモートホストのドメイン名をクエリしている。
Trojan:EC2/DropPoint!DNS EC2 インスタンスは、マルウェア によって収集された認証情報やその他の盗難されたデータによって認識されているリモートホストのドメイン名をクエリしている。
Trojan:EC2/DGADomainRequest.B EC2 インスタンスで、アルゴリズムを使用して生成されたドメイン がクエリされている。
Trojan:EC2/DGADomainRequest.C!DNS EC2 インスタンスで、アルゴリズムを使用して生成されたドメイン がクエリされています。このようなドメインは、一般的にマルウェアによって悪用されることが多く、EC2 インスタンスが侵害されている場合がある。
Trojan:EC2/DNSDataExfiltration EC2 インスタンスが DNS クエリを通じて データを密かに抽出 しようとしている。
Trojan:EC2/PhishingDomainRequest!DNS EC2 インスタンスは フィッシング攻撃 に関与するクエリ実行のドメインである。
UnauthorizedAccess:EC2/MetadataDNSRebind Amazon EC2 インスタンスが、インスタンスメタデータサービスに解決される DNS ルックアップ を実行している。
UnauthorizedAccess:IAMUser/TorIPCaller API が Tor 出口ノードの IP アドレスから呼び出された。
UnauthorizedAccess:IAMUser/MaliciousIPCaller.Custom API が カスタム脅威リスト にある IP アドレスから呼び出された。
UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B 世界中でコンソールに対する複数の正常なログインが確認 された。
UnauthorizedAccess:IAMUser/MaliciousIPCaller API が既知の悪意のある IP アドレス から呼び出された。
UnauthorizedAccess:EC2/TorIPCaller EC2 インスタンスが Tor 出口ノードからのインバウンド接続を受信している。
UnauthorizedAccess:EC2/MaliciousIPCaller.Custom EC2 インスタンスが カスタム脅威リスト内の IP アドレス とアウトバウンド通信している。
UnauthorizedAccess:EC2/SSHBruteForce EC2 インスタンスが SSH ブルートフォース攻撃 に関与している。
UnauthorizedAccess:EC2/RDPBruteForce EC2 インスタンスが RDP ブルートフォース攻撃 に関与している。
UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration インスタンス起動ロールを通じて EC2 インスタンス専用に作成された 認証情報が外部 IP アドレスから使用されている
UnauthorizedAccess:IAMUser/ConsoleLogin AWS アカウントのプリンシパルによる 通常とは違うコンソールへのログイン が確認された。
UnauthorizedAccess:EC2/TorClient EC2 インスタンスは Tor Guard または Authority ノードに接続している。
UnauthorizedAccess:EC2/TorRelay EC2 インスタンスは、Tor リレーとして Tor ネットワークに接続中である。

Amazon GuardDuty のセットアップ

Amazon GuardDutyはCloudFormationに対応しているため、CloudFormation経由でGuardDutyをセットアップすることができる。

サービスロールの有効化

以下のサービスロールを有効化することで、EC2リストの読み込み権限GuardDuty に付与する。これは、悪意のあるアクティビティに関係する AWS 環境の EC2 インスタンスのメタデータを取得するためである。

Resources:
  ServiceLinkedRoleForGuardDuty:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: guardduty.amazonaws.com
      Description: A service-linked role required for Amazon GuardDuty to access your resources.

GuardDutyの有効化

GuardDuty を有効化する。有効化すると直ちにデータの取得と分析を開始する。 これらの処理は、通常のAWS CloudTrail、VPC フローログ、および DNS ログの保存とは独立している。

Resources:
  GuardDutyDetector:
    DependsOn:
      - ServiceLinkedRoleForGuardDuty
    Type: AWS::GuardDuty::Detector
    Properties:
      Enable: true

CloudFormation Launch Stack URL

以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。

作成されるAWSサービス CloudFormationテンプレート
セキュリティサービス全般 cloudformation-launch-stack
GuardDutyのみ cloudformation-launch-stack

AWS Config(1)Configの概要

AWS Configとは

AWS Configは、リソースごとの設定項目を生成し、履歴としてこれを保持するため、全ての変更を追跡することが可能で、AWSリソース間の関係と設定の履歴などを確認することができる。

  • リソースの設定が最適であるか
  • 現在のスナップショットの取得
  • リソース設定の取得
  • 設定履歴の取得
  • リソース間の関係の表示
  • 通知

これらの機能を用いて、リソースの管理監査とコンプライアンス設定変更の確認とトラブルシューティングセキュリティ分析などを行うことができる。

設定項目は、S3バケットに蓄積することが可能で、データはJSON形式で、S3に6時間ごとに送信される。また、リソースが変更されたタイミング等で、Amazon SNSを用いてEメール等で通知することも可能である。

AWS Configは、マルチアカウントマルチリージョンの データ集約 に対応しており、複数のアカウントやリージョンの設定、コンプライアンスデータを1つのアカウントに集約することができる。

https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-aws-cloudtrail-aws-config?ref=https://tech.blog.surbiton.jp/

AWS Configの概念

設定履歴と設定項目、スナップショット、レコーダ

設定履歴は、特定期間の特定リソースに関する設定項目のコレクションである。また、設定項目は、アカウント内のサポートされているAWSリソースの属性(メタデータ、関係、設定、関連イベントなど)を記録したものである。設定スナップショット は、設定項目のコレクションで、記録対象のリソースの全体像を示す。スナップショットは、S3 Bucketに配信が可能。

設定レコーダは、(標準設定では)Configがサポートしている全てのリソースの設定項目の評価と保存を行う。設定レコーダをオフにすると設定変更トリガによる評価は実行されない。一方で、定期実行トリガは引き続き指定した間隔で実行される

設定ストリーム

設定ストリームは、設定項目の自動更新リストで、リソースの作成や変更、削除が行われる度に、Amazon SNSを使用して通知を行うことができる。

ルール

AWS Configでは、望ましい設定をルールとして定めることができ、これに違反しているリソースに対しては、非準拠 のフラグを立てる。ルールは、事前に用意されたマネージドルールのほかに、ユーザが自ら作成したカスタムルールを適用することもできる。これらのルールは、リソースの設定変更時に評価されるのか、それとも定期的に評価されるのかを定義することができる。

AWS Configの仕組み

AWS Configは、サポートされているAWSリソースを検出し、リソースごとに設定項目を生成し、その記録を履歴として保持する。Configはリソースごとに、DescribeもしくはListのAPIコールによって、リソースの全ての変更を追跡する。Configルールを利用することで、定期的にこのルールに照らして、リソースの設定の評価を行うことができる。

また、この設定項目は、S3バケット もしくは Amazon SNS に配信することができる。SNSへ配信時のメッセージタイプは以下の通り。

メッセージタイプ 内容
ComplianceChangeNotification コンプライアンスタイプの変更時
ConfigRulesEvaluationStarted リソースの評価開始時
ConfigurationSnapshotDeliveryStarted スナップショット配信開始時
ConfigurationSnapshotDeliveryCompleted スナップショット配信完了時
ConfigurationSnapshotDeliveryFailed スナップショット配信失敗時
ConfigurationHistoryDeliveryCompleted 設定履歴配信完了時
ConfigurationItemChangeNotification リソース変更時
OversizedConfigurationItemChangeNotification SNSの最大サイズ超過時

AWS Configのセットアップ

AWS ConfigはCloudFormationに対応しているため、CloudFormation経由でConfigをセットアップすることができる。

サービスロールの有効化

以下のサービスロールを有効化することで、AWSリソースの読み込み権限 および S3への書き込み権限Config に、IAMとSystemManagerへの書き込み権限Config Remediation にそれぞれ付与する。

Resources:
  ServiceLinkedRoleForConfig:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: config.amazonaws.com
      Description: A service-linked role required for AWS Config to access your resources.
  ServiceLinkedRoleForConfigRemediation:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: remediation.config.amazonaws.com 
      Description: A service-linked role required for AWS Config Remediation to access your resources.

Configの有効化

DeliveryChannelConfigurationRecorder を作成する。

Resources:
  ConfigDeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      Name: default
      S3BucketName: !Ref S3ForConfig
      SnsTopicARN: !Ref SnsTopicARN
  ConfigConfigurationRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: default
      RecordingGroup:
        AllSupported: true
        IncludeGlobalResourceTypes: true
      RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig

すでにAWS Configをセットアップ済みの状態で上記テンプレートを実行すると、 the maximum number of delivery channels エラーが発生する。その場合は既存の DeliveryChannel を削除した上で、上記テンプレートを再度実行する。

aws configservice delete-delivery-channel --delivery-channel-name default
aws configservice delete-configuration-recorder --configuration-recorder-name default

S3バケットの作成

設定情報 (履歴ファイルやスナップショット)を保存するために使用する、Amazon S3 バケットと、それに紐づくバケットポリシーを作成する。

Resources:
  S3ForConfig:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub defaultsecuritysettings-config-${AWS::Region}-${AWS::AccountId}
      LifecycleConfiguration:
        Rules:
          - Id: ExpirationInDays
            ExpirationInDays: 60
            Status: Enabled
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  S3BucketPolicyForConfig:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: !Ref S3ForConfig
      PolicyDocument:
        Version: 2012-10-17
        Id: !Ref S3ForConfig
        Statement:
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action:
              - 's3:GetBucketAcl'
              - 's3:ListBucket'
            Resource:
              - !GetAtt S3ForConfig.Arn
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action:
              - 's3:PutObject'
            Resource:
              - !Join
                - ''
                - - !GetAtt S3ForConfig.Arn
                  - /AWSLogs/
                  - !Sub ${AWS::AccountId}
                  - /Config/*
            Condition:
              StringEquals:
                s3:x-amz-acl: bucket-owner-full-control

CloudFormation Launch Stack URL

以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。

作成されるAWSサービス CloudFormationテンプレート
セキュリティサービス全般 cloudformation-launch-stack
Configのみ cloudformation-launch-stack

モニタリング

他のAWSサービスを利用して、AWS Configのリソースをモニタリングすることができる。例えば、Amazon SQSAmazon CloudWatch Eventsを利用することで、AWSリソースが作成、変更、削除された際に通知を受け取ることが可能となる。

AWS Security Hub(1)Security Hubの概要

Security Hubとは

Security Hubは、Amazon GuardDutyAmazon InspectorAmazon Macie などのAWSが提供するセキュリティ関連サービスや、AWSパートナーが提供するセキュリティ製品からの セキュリティ検出結果等を統合的に閲覧可能なサービス で、本サービスを利用することで、情報の収集や優先度の決定などのコストを低減できる。発見事項は、Security Hub内に90日保管 される。Security Hubは、リージョンサービスであり、使用するリージョン毎にサービスを有効化する必要 がある。一方で、 複数アカウントをサポート しており、全てのアカウントを統合して発見事項を表示することもできる。

また、Center for Internet Security (CIS) AWS Foundations Benchmark のスコア表示にも対応しており、業界標準のベストプラクティスをどの程度満たしているかについても確認することが可能となっている。なお、この機能を正常に実行するためには、AWS Configを有効化することが必要。ベストプラクティスを満たしていない場合は、Security Hubから修復方法を確認することができる。

Amazon CloudWatch Eventsとの統合がサポートされているため、検出結果を受信した際に実行するカスタムアクションを規定することもできる。

また、インサイトと呼ばれるグループ化された検出結果のコレクションが存在し、コレクションを用いることで、修復が必要な問題の特定ができる。カスタムインサイトを作成することも可能。

AWS Security Hub のセットアップ

一部機能のみではあるがCloudFormationに対応しているため、CloudFormation経由でSecurity Hubをセットアップすることができる。

サービスロールの有効化

以下のサービスロールを有効化することで、AWS CloudTrail, AWS Config, Amazon CloudWatch Logs および Amazon SNS から 情報を取得する権限 を Security Hub 付与する。また、AWS Config に対して 新たなConfigルールを設定する権限 も付与される。このルールは、CIS AWS Foundationsコンプライアンスチェックに使用される。これらを正常に動作させるためには、 AWS Configを有効化 しておく必要がある。

Resources:
  ServiceLinkedRoleForSecurityHub:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: securityhub.amazonaws.com
      Description: A service-linked role required for AWS Security Hub to access your resources.

Security Hubの有効化

Security Hubを有効化することで、CIS AWS Foundationsコンプライアンスチェックが自動で有効化される。

Resources:
  SecurityHub:
    DependsOn:
      - ServiceLinkedRoleForSecurityHub
    Type: AWS::SecurityHub::Hub

AWS Security Hubのセットアップテンプレート

AWS Security Hubを含むAWSのセキュリティサービスをまとめて有効化できるCloudFormationテンプレートを公開している。

作成されるAWSサービス CloudFormationテンプレート
セキュリティサービス全般 cloudformation-launch-stack
Security Hub のみ cloudformation-launch-stack

CIS AWS Foundationsコンプライアンスチェック

Security Hubは、AWS Configに新たなConfigルールを自動的に作成した上で、Center for Internet Security (CIS) AWS Foundations Benchmarkに適合しているかのチェックを行う。Security Hubは、AWS Security Finding と呼ばれるテンプレートに沿って検出結果を表示するために、結果毎にデータ変換等を行う必要がない。AWS Security Finding の構成については、下記を参照のこと。

なお、CIS AWS Foundationsは、同一リージョン内のリソースに対しての結果のみ有効であり、他のリージョンのリソースに対しての結果は FAILED が返却される。したがって、例えば複数のリージョンでCloudTrailが有効化されており、各リージョンで証跡用およびアクセスログ用のバケットが作成されている場合は、チェック 2.3 および 2.6は非準拠として表示される

チェックは、前回から12時間以内に再度実行 される。また、変更によってトリガーされるチェックに関しては、リソースに変更が変更された際に実行される。

AWSサービスとの統合

Security Hubは、Amazon GuardDutyAmazon InspectorAmazon Macie など、AWSが提供するセキュリティ関連サービスで生成されたセキュリティ検索結果を統合することができる。統合を行うためには、各AWSサービスを有効化する必要がある。

CloudWatchイベントによる自動化

CloudWatchイベントを使用して、Security Hubで検知した問題やリソースの変更に自動的に対応することが可能である。以下の通知を行うことが可能である。

  1. 全ての結果を自動的にCloudWatchイベントに送信
  2. カスタムアクションに関連づけられた結果をCloudWatchイベントに送信
  3. カスタムアクションを使用してインサイトの結果をCloudWatchイベントに送信

1.の場合は、CIS AWS Foundationsコンプライアンスチェックに準拠している状態でも非準拠の場合でも、全ての結果が CloudWatch Events に送信されてしまうので、そのうち 準拠から非準拠となった状態のイベントのみを受信して、Amazon SNS に送信する場合は、以下のような Amazon CloudWatch Events を作成する。

  CloudWatchEventsForSecurityHub:
    Type: AWS::Events::Rule
    Properties: 
      Description: CloudWatch Events about SecurityHub.
      EventPattern:
        source:
          - aws.securityhub
        detail-type: 
          - Security Hub Findings - Imported
        # Events fired when status has been changed from PASSED to ARCHIVED.
        detail:
          findings:
            Compliance:
              Status:
                - PASSED
            RecordState:
              - ARCHIVED
      Name: AWS_Security_Hub
      State: ENABLED
      Targets:
        - Arn: !Ref SnsTopicARN
          Id: CloudWatchEventsForSecurityHub

これは、結果のステータスが PASSED から FAILED に変化した場合、

  1. 既存の結果のステータスを PASSED から ARCHIVED に設定
  2. 結果のステータスが FAILE である新たな結果を生成

という挙動となるため、1.の挙動のみを検知することで実現している。

CloudFormation Launch Stack URL

以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。

作成されるAWSサービス CloudFormationテンプレート
セキュリティサービス全般 cloudformation-launch-stack
Security Hub のみ cloudformation-launch-stack

AWS Connect(1)AWS Connectの概要

AWS Connectとは

AWS Connectとはクラウド型コンタクトセンターで、Amazonのコンタクトセンターと同じ技術が使われている。グラフィカルインタフェースを用いることでコーディングすることなく、対応フローの設計、スタッフの管理などが簡単に実現できる。

インフラの管理が不要で手軽に規模を拡大縮小できる。また、Amazon Lexとの連携によって自動応答を実現したり、CRMソリューションと連携して顧客情報の管理を行うこともできる。また、アウトバンドコンタクトAPIを用いて、スケジュールした時刻にプログラムから電話を発信することも可能である。

サポートされているブラウザは、最新3バージョンChrome最新Firefox。東京リージョンに対応し日本語にも対応している。

AWS Amplify Framework(1)Amplifyの概要

AWS Amplify Frameworkとは

AWS Amplifyは、モバイルアプリやウェブアプリの実装を容易にするフレームワークで、AWS上のバックエンドをプロビジョニングし、iOSAndroidWeb、React Native上などのフロントエンドと簡単に統合することが可能なライブラリUIコンポーネントCLIなどを提供する。バックエンドのサービスを設定可能なAmplify CLIや、Web上に展開するAmplify JSなどのリソースがGitHub上で提供されており、認証解析プッシュ通知ボットなどの機能を実装することが可能である。

Amplify Frameworkは、カテゴリベースのプログラミングモデルを採用しており、対話式の設定画面から各カテゴリを追加/編集/削除することができる。

機能名 Frontend API Backend Category AWSサービス 内容
Analytics AnalyticsClass analytics Pinpoint ユーザのセッションや属性などを計測
Interactions Interactions intaraction Lex Botの構築
Cache CacheObject LRUキャッシュ
API APIClass api Lambda + API Gateway REST/GraphQL APIの利用
PubSub PubSub IoT リアルタイムデータのやりとり
Hub HubClass ユーザセッション、属性等を追跡
Authentication AuthClass auth Cognito 認証APIとpre-build UI component
Notification PushNotification notifications Pinpoint プッシュ通知
I18n I18n 多言語化
Storage StorageClass storage S3, DynamoDB 静的コンテンツの管理
XR XR xr Sumerian AR/VR
Logger Logger コンソールログの記録
Service Worker ServiceWorkerClass
function Lambda 関数の作成
hosting S3, CloudFront Webサイトホスティング
Predictions prediction Recognition など 予測

Amplify CLI

Amplify CLIを用いることでバックエンドを簡単に設定することができる。バックエンドのカテゴリごとにカテゴリプラグインや、プロバイダープラグインフロンドエンドプラグインなど様々なプラグインが用意されている。これらのリソースの状況は、amplify statusコマンドで確認することができる。

初期設定

amplify initコマンドを実行することで、フロントエンドの設定確認と初期化、AWS上のバックエンドをセットアップすることができる。このとき、CloudFormation経由で IAMロールやS3バケットの作成 も行われる。

コマンド 実行内容 備考
amplify init Amplify プロジェクトを作成/初期化, IAMロールの作成 ルートディレクトリで実行すること
amplify delete Amplify プロジェクトをすべて削除 再度構築する場合は amplify init が必要

コマンドの実行手順は以下の通り。

実行順序 コマンド 内容
1 amplify configure AWSユーザや認証情報の設定
2 amplify init プロジェクトの作成
3 amplify add カテゴリの追加
4 amplify push バックエンドのデプロイ

バックエンドの環境設定

1つのプロジェクトは設定の異なる複数のバックエンド(=Env)を持つことが可能で、amplify envコマンドを用いてこれらのバックエンドを切り替えることが可能。Gitのブランチと組み合わせることも可能で、masterブランチ上のプロジェクトはprod環境のバックエンド上にデプロイ、developブランチ上のプロジェクトはdevelop環境のバックエンド上にデプロイするなどの設定を行うことができる。万が一、AWS上のCloudFormationを削除してしまった状態のままデプロイした場合はエラーとなるので、この場合はamplify initコマンドでバックエンドの再生成が必要となる。

コマンド 実行内容
amplify env add <ENV> バックエンドを追加
amplify env remove <ENV> バックエンドを削除
amplify env pull <ENV> –restore AWS上のバックエンド設定を参照して上書き
amplify env ckeckout <ENV> –restore 指定した環境設定を適用
amplify env list バックエンドの一覧を表示

AWS Amplify Console等の外部サービスでAmplifyをデプロイしたあとに、amplify pushコマンドを用いて開発環境上でデプロイを実行すると、バックエンドのデプロイ状態に差異が生じているためにデプロイに失敗する。上記のamplify env pullコマンドによって、AWS上の最新のバックエンド情報を取得することで、この問題は解決する。

カテゴリの追加と削除

上述のようにAmplify Frameworkは、認証解析などの様々な機能を有している。これらの機能(=カテゴリ)を自身のプロジェクトに追加したり削除したりするのが以下のコマンドである。

コマンド 実行内容
amplify add <CATEGORY> カテゴリを追加
amplify update <CATEGORY> カテゴリを更新
amplify remove <CATEGORY> カテゴリを削除

その他のコマンド

その他よく使うコマンドは以下の通り。

コマンド 実行内容
amplify status Amplify プロジェクトのステータスを表示
amplify push Amplify プロジェクトをAWS上でデプロイ
amplify pull AWSから設定情報を取得し、ローカル環境を変更
amplify console AWSのマネージメントコンソールに遷移
amplify delete Amplify プロジェクトを削除

Amplifyプロジェクト

Amplifyプロジェクトは、以下のようなディレクトリ構成となっている。

.
├── amplify/
│   ├── .config/                        (自動生成)   クラウドの構成とユーザー設定を格納 (amplify init)
│   │   ├── local-aws-info.json         (自動生成)  AWSクレデンシャルのプロファイル名を格納
│   │   ├── local-env-info.json         (自動生成)  ローカルのディレクトリやIDEの設定を格納
│   │   └── project-config.json         (自動生成)  プロジェクトの設定を格納       
│   ├── backend/
│   │   ├─── api
│   │   │   └── PROJECT_NAME
│   │   │       └── schema.graphql      (編集可)    GraphQLのスキーマ
│   │   ├─── auth
│   │   │   └── PROJECT_NAME
│   │   │       └── parameters.json     (編集可)    プロンプトで設定した内容を格納(amplify add auth)
│   │   ├── amplify-meta.json          (自動生成)   AWSリソースの設定情報(Permission, Category)を格納, Gitリポジトリの管理対象外
│   │   └── awscloudformation          (自動生成)   CloudFormationのルートスタック, Gitリポジトリの管理対象外   
│   ├──  #current-cloud-backend/       (自動生成)  直近に取得したクラウド構成, Gitリポジトリの管理対象外
│   └──  team-provider-info.json       (自動生成)  Environment設定(Permission, Category, CloudFormation Stack)を格納
└──  src/
    ├── App.vue                         (編集可)     Vueの単一コンポーネントファイル   
    ├── aws-exports.js                  (自動生成)   AWSリソースのエンドポイント等の情報を格納, Gitリポジトリの管理対象外 (amplify init)
    ├── components/                     (手動生成)   作成したVueコンポーネント
    │    ├── Authenticator.vue         (自動生成)   認証画面コンポーネント
    │    └── Main.vue                  (手動生成)   メインコンポーネント
    ├── graph/                          (自動生成)   GraphQL statement
    │    ├── mutation.js               (自動生成)   
    │    ├── queries.js                (自動生成)   
    │    ├── schema.json               (自動生成)   
    │    └── subcriptions.js           (自動生成)   
    ├── main.js                         (編集可)     Vueのエントリーポイント 
    ├── package.json                    (自動生成)   依存関係のあるライブラリの一覧
    └── router/                         (手動生成)   ルータコンポーネント
         └── index.js                  (手動生成) 

AWS認定(3)SysOps アドミニストレーター(アソシエイト)に合格するまで

AWS認定SysOpsアドミニストレーター試験合格に向けての資料集。以下の資料を何度も読み込んで、手を動かしながら実践を繰り返すことが合格の近道となる。

出題範囲と学習法

AWS認定SysOpsアドミニストレーター試験の問題は、AWS上でデプロイ運用管理を行う際に、可用性や拡張性を考慮してどのようなサービスや機能を選択すべきかについて問われることが多い。AWSが提供するサービスは100を超えるが、本試験を受講する上では以下のサービスを理解しておくことが望ましい。

カテゴリ サービス名
コスト管理 Cost Explorer
コンピューティング Auto Scaling, ELB
データベース RDS
マネジメントとガバナンス CloudWatch, Personal Health Dashboard, Config, System Manager, CloudFormation, Trusted Advisor
移行と転送 Snowball
ネットワーキングとコンテンツ配信 VPC, Route 53, DirectConnect
セキュリティとコンプライアンス IAM, Organizations
ストレージ S3, Glacier, EBS

勉強法は、

  1. サンプル問題集に目を通してレベルを確認する
  2. 以下の資料を読みながら実際に各サービスに触れる
  3. 模擬試験を受講する

で十分合格ラインに行くかと。ちなみに学習時間はソリューションアーキテクトとデベロッパーを取得済みだったので3日ほど。なお、各サービスのドキュメントにベストプラクティスの項目が存在する場合は、該当部分を理解しておく

対策本

対策本はほとんど発売されていない。以下の本が唯一の試験対策本。この本には、各サービスの概要や特徴が簡潔に書かれており、AWSの各サービスの概要を学ぶためには非常に有効。一方で、章末問題と実際の試験問題は異なるので、実際の問題に慣れるためには、模擬試験の受講が必要である。

AWSの概要とセキュリティ

AWS(1)AWSの概要とメリット
AWS(4)Well-Architectedフレームワーク
AWS(5)セキュリティのベストプラクティス

AWS Identity and Access Management

AWS(2)セキュリティの概要
AWS Identity and Access Management(1)IAMの概要
AWS Identity and Access Management(4)STS

AWSの基本サービスの概要

Amazon EC2 と Elastic Load Balancing

AWS EC2(1)EC2の概要
AWS EC2(3)AMIとインスタンス
AWS EC2(6)Elastic Load Balancing
AWS EC2(7)Auto Scaling

Amazon VPC

AWS VPC (1)Amazon Virtual Private Cloud とは

Amazon S3

AWS S3(3)S3の概要
AWS S3(4)使用する上で注意すること

Amazon RDS

AWS RDS(1)Relational Database Serviceの概要

Amazon SQS

AWS SQS(1)Amazon Simple Queue Serviceの概要

AWS CloudFormation

AWS CloudFormation(1)CloudFormationの概要

Amazon CloudWatch

AWS CloudWatch(1)CloudWatchの概要

AWS EC2(7)Auto Scaling

EC2 Auto Scalingとは

EC2 Auto Scalingを用いることで、アプリケーションの負荷を処理するための適切な数のEC2インスタンスを利用することができる、。Auto Scalingを利用するためには、Auto Scalingグループと呼ばれるEC2インスタンスの集合を定義し、このグループに含まれる最小と最大のインスタンスの数を定義する。また、希望するインスタンス数(Desired capacity)を定義することも可能。また、Auto Scalingグループ内のEC2インスタンスを複数のAZに分散配置することで、地理的な冗長性や安全性を実現できる。

Auto Scaling グループ

Auto Scalingを用いることで、耐障害性や可用性が向上する。また、必要な数のインスタンスのみ起動されるため安定的なパフォーマンスを低コストで実現することができる。

Auto Scalingグループ内の各EC2インスタンスの負荷に偏りが発生した場合は、古いインスタンスを終了して新しいインスタンスを起動させる。この場合にスムーズに処理が継続されるように、一時的に最大容量に対して10%のマージンが確保される

ライフサイクル

Auto Scalingのライフサイクルは以下の通り。

ライフサイクル

Auto Scalingグループはグループ内のインスタンスに対して定期的にヘルスチェックを行なっている。スケールイン/アウトは、手動もしくはスケーリングポリシースケジュールに基づき実行される。スケールイン、ヘルスチェックの失敗、Auto Scalingグループからの離脱等が発生した場合には、Auto Scalingグループ内のEC2インスタンスは終了処理が実施される。

Auto Scalingグループ

起動設定

Auto Scalingグループ内のEC2インスタンスは、起動テンプレートもしくは起動設定の設定内容に基づいて起動される。これらには、AMIのIDやインスタンスタイプ、ネットワーク設定、ストレージの設定、オンデマンドインスタンスとスポットインスタンスの配分等が含まれる。また、起動設定は、既に起動済みのインスタンスの属性を使用して作成することも可能である。Auto Scalingグループに関連付けられる起動設定は1つだけであり、グループ作成後に変更することはできない。Auto Scalingグループに関連づける起動設定を変更する場合は、現在の起動設定をコピーした上で新たな起動設定を作成し、これを当該のAuto Scalingグループに紐づける。

ロードバランサとの連携

Auto Scalingで増減したインスタンスに対して適切にトラフィックが分散されるようにするためには、Elastic Load Balancingの受信トラフィックの通信先にAuto Scalingグループを指定する。Auto Scalingのヘルスチェックは、通常EC2のステータスチェックのみであるが、オプションでELBのヘルスチェックを用いてAuto Scalingグループのヘルスチェックを行う設定にすることも可能である。この場合、ELBから送られる定期的なPINGに応答しないなど、ELBのヘルスチェック合格しなかった場合、このインスタンスは異常ありと判定されて他のインスタンスに置き換えられる。

スケーリング

Auto Scalingでは、以下のスケーリング方法を実施可能である。

  • 現在のインスタンスレベルの維持
  • 手動スケーリング
  • スケジュールに基づくスケーリング
  • 要求に基づくスケーリング(動的スケーリング

CloudWatchのメトリクスを利用して複数のスケーリングポリシーを適用することも可能である。例えば、EC2のCPU使用率を指標としたポリシーと、SQSのメッセージ処理に関するメトリクスを指標としたポリシーを同時に適用する、といったような場合である。複数のポリシーが適用となった場合は、より影響を与えるポリシーの実行命令が優先される

スケジュールされたスケーリング

あらかじめ指定したスケジュールに沿って、スケーリングアクションが実行されるように指定することが可能である。スケーリングアクションが有効になる時間と、最小/最大サイズ希望するサイズを指定する。このスケジュールは、1回のみ実行することも定期的に実行することもできる。

スケジュールされたスケーリングを作成する場合、ほとんどの場合指定した時刻から数秒以内に実行されるが、最大2分ほど遅れる可能性もあるので留意が必要である。また、複数のスケジュールを同時刻に設定することはできない。

動的スケーリング

動的スケーリングは、以下の方法をサポートしている。

ポリシー名 トリガおよび動作
Target tracking scaling 特定のメトリクスのターゲット値を維持するようにスケーリング
Step scaling 複数のスケーリング調整値をトリガにスケーリング
Simple scaling 1つのスケーリング調整値をトリガにスケーリング

Simple scaling および Step scaling

トリガに基づいてスケーリングが実行される際には、以下の調整タイプに基づいてスケーリングが実行される。

調整タイプ 動作
ChangeInCapacity 指定した数だけ増減する
ExactCapacity 指定した数になるように増減する
PercentChangeInCapacity 割合指定する

また、Step scalingの場合は、新しく起動されたインスタンスがAuto Scalingグループに追加されるまでの待ち時間(ウォームアップ)を指定できる。

SQSに基づくスケーリング

SQSにキューが積み上がり、処理が遅延することがないようにするには、 SQSのデータを読み取り処理を行うEC2をAuto Scalingさせる必要がある。このAuto Scalingを適切にスケーリングさせるためには、 Amazon SQS メトリックスApproximateNumberOfMessagesを用いてキューの長さを測定した上で、1インスタンスあたりの処理能力を計算しどの程度スケーリングさせる必要があるか指定する。

SQSに基づくスケーリング

クールダウン

メトリクス値が短期間で増減し、その度にスケーリングが実行されることを防ぐために、クールダウン期間が設けられている。デフォルトのクールダウン値は300秒。クールダウン期間は新たなスケーリングは実行できない。なお、このクールダウンが有効なのは、Simple scalingのみ。

インスタンスの停止

スケールイン時に停止されるインスタンスは以下の条件で決定される。

  1. インスタンスが最も多いAZ
  2. 最も古い起動設定またはテンプレートを使用している
  3. 次の課金開始時間に近いインスタンス

終了時ポリシーはカスタマイズが可能である。また、終了から保護するインスタンスを指定することもできる。

ポリシー名 実行内容
OldestInstance 最も古いインスタンス
NewestInstance 最も新しいインスタンス
OldestLaunchConfiguration 最も古い起動設定のインスタンス
ClosestToNextInstanceHour 次の課金開始時間に近いインスタンス
Default デフォルト(上記)
OldestLaunchTemplate 最も古い起動テンプレート
AllocationStrategy オンデマンド/スポットの割り当て戦略に合わせて決定

ライフサイクルフック

インスタンスの起動時もしくは削除時に一時停止して、カスタムアクションを実行できる機能。ソフトウェア等をインストールできる。

ライフサイクルフック

スケーリングプロセスの中断と再開

スケーリングプロセスの1つ以上を停止し、あとで再開できる。

スケーリングプロセス 内容
Launch インスタンスを追加
Terminate インスタンスを削除
HealthCheck ヘルスチェック
ReplaceUnhealthy 異常なインスタンスを削除し代替インスタンスを作成
AZRebalance AZ間のバランスを調整
AlarmNotification CloudWatchからアラーム通知を受け取る
ScheduledActions スケジュールされたアクションを実施
AddToLoadBalancer ELBに追加

注意事項

Auto Scalingは、バーストトラフィックには対応できない

AWS API Gateway(3)カスタムログの出力


API Gatewayは、詳細のアクセスログをCloudWatch Logsに吐き出すことができる。CloudWatch Logsへのログ書き込みを行うためには、書き込み権限の取得とログを書き込むロググループの指定が必要となる。

IAMロールの指定

IAM上でAPI GatewayからCloudWatch Logsへの書き込み許可を持つIAMロールを作成する。IAMでは、あらかじめAmazonAPIGatewayPushToCloudWatchLogsと呼ばれるポリシーが用意されているため、このポリシーがアタッチされたIAMロールを作成する。この作成したIAMロールをAPI Gatewayの設定画面上で指定することで、API GatewayはCloudWatch Logsへの書き込み権限を取得する。

ログの指定

次にAPI Gateway上の各APIのログ/トレース設定画面にて、カスタムアクセスのログ記録を有効化する。入力項目は、CloudWatchロググループのARNと、ログ形式の2種類。ログ形式は、JSONやCLFなどの中から選ぶと自動的に入力される。

AWS API Gateway(2)Kinesisへのデータ投入

API Gatewayから大量のデータを投入し、これらのデータを解析および蓄積する場合には、API GatewayからLambdaに直接データを渡すのではなく、大規模データストリームサービスのKinesisを介した方が、バックエンドのシステムが高負荷に晒されずに安定的に稼働させられる場合がある。

API Gatewayとバックエンドのエンドポイントとの接続は、API Gateway内の統合リクエスト機能を用いて行い、統合リクエストは下の5つの統合タイプを用意している。

  • Lambda関数
  • HTTP
  • Mock
  • AWSサービス
  • VPCリンク

Mockは、バックエンドと接続せずにレスポンスを返す統合タイプで、テストを行う際や、CROSのプリフライトリクエストの返答などに用いる。

統合リクエスト

Kinesisと接続する場合は、POSTメソッドを作成し、上記のうちの「AWSサービス」を選択して以下のように各欄に必要事項を入力する。Kinesisへデータ投入する際には、Kinesis側で用意されているputRecordメソッドを使用する。

データ入力項目

項目 入力内容 備考
統合タイプ AWSサービス  
AWS リージョン 当該Kinesisのリージョン  
AWS サービス Kinesis  
AWS サブドメイン 空欄  
HTTP メソッド POST  
アクション PutRecord  
実行ロール KinesisへのputRecordをAPI Gatewayに許可するIAMロール arn:aws:iam::account-id:role/iam-role-name

IAMロールについては、KinesisへのputRecordをAPI Gatewayに許可する記述が必要で、IAM上で以下の内容を含んだIAMロールを作成する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": "arn:aws:kinesis:*:*:stream/*"
        }
    ]
}

データマッピング

API GatewayからKinesisにデータを投入する場合は、クライアントから受信したデータをKinesisが規定するデータフォマットに変換する必要がある。これに対応するのがデータマッピング機能で、Velocity Template Languageを用いて記述することができる。

よく使われる関数および使用例を以下に挙げる。

記述 内容
#set($param = ”) 変数の定義
#if(評価式) #end if文
$context.requestTimeEpoch データの受信時刻
$input.path(‘$.param’) 入力データ内の指定タグの値
$input.path(‘$.param’).size 入力データ内の指定タグの数
$input.params().header.get(”) ヘッダ内の指定タグの値
$input.json(‘$.param’) 入力データ内の指定タグJSONデータ
$util.urlDecode($input.path(‘$’)) 入力データをURLデコード
$util.escapeJavaScript(data) 文字をエスケープ
$util.base64Encode(data) 文字をBASE64エンコード

また、これらを使用してデータマッピングを記述すると以下となる。

#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}