CloudFormationによる環境構築をCodePipelineで自動化することを考えている方にお伝えしたいTips

1. 概要

本投稿は、CodePipelineを使ったCloudFormationによる環境構築について、実際の開発現場でも使えるTipsを紹介しています。

CloudFromationはテンプレートファイルに設定情報を記載しておくことで、何度でも同じ環境を再現できる非常に便利なサービスで、AWSの環境構築に利用している方も多いと思います。 しかし、実際の開発の現場では、VPC,EC2,S3・・・とサービス毎にテンプレートファイルが分かれているケースが多く、沢山のテンプレートを正しい順序で正確に実行するという作業に煩わしさを覚えている開発者の方も多いのではないでしょうか。

私自身、上述の課題を解決したいという思いを理由の一つに、CloudFormationによるデプロイをCodePipelineにより自動化しました。 しかし、自動化の恩恵を得るためには、テンプレートファイルの記載方法やCodePipelineの定義方法などに工夫が必要でしたので、Tipsとしてそれらを紹介します。


[対象読者]

  • CloudFromationの利用経験がある方。

  • CloudFromationのデプロイを効率化したいと思っている方。

  • IaCツールは沢山あるが、やっぱり純正ツールが良いよねと思っている方。

  • 開発環境やDR環境の費用削減をしたい方。

※CloudFromationの利用経験がない方はまずは以下を参照することを推奨します。
20200826 AWS Black Belt Online Seminar AWS CloudFormation


[目次]

1. 概要
2. AWS CloudFormationとは
3. AWS CodePipelineとは
  • シンプルな使い方

  • CloudFormationテンプレートによるデプロイをCodePiplelineで繰り返し実行する際のTips

4. CodePipeline x CloudFormationを検討している方に是非実施していただきたいTips
CloudFormationテンプレートに関するTips
  • CloudFormationテンプレートはリソースのライフサイクルに合わせて分割する

  • クロススタックリファレンスを利用する

  • 自動作成されるリソースもCloudFormation管理下に置くことを意識する

  • VPCフローログとCloudWatchLogsのロググループのテンプレートは分離する

CodePipelineに関するTips
  • CodePipelineのアクションはCloudFormationテンプレートで定義する

  • CodePipelineのアクションの順序(RunOrder)はガントチャートで整理する

  • パイプラインのアクション名は短い名前にする

  • CloudFormationアクションとCloudFormationスタックセットアクションの機能差分

  • CodePiplelineとデプロイ先環境のリージョンについて

【IAM】 CodePipelineのCloudFormationスタックセットアクションを使用する際のTips
  • 自動作成されるCodePipeline用のIAMロールはさらに権限を絞る

  • CodePipelineのCloudFormationスタックセットアクションを使用する場合IAMロールの名称に指定がある

5. まとめ

2. AWS CloudFormationとは

引用:20200826 AWS Black Belt Online Seminar AWS CloudFormation

3. AWS CodePipelineとは

AWS CodePipeline は、ソフトウェアをリリースするために必要なステップのモデル化、視覚化、および自動化に使用できる継続的な配信サービスです。ソフトウェアリリースプロセスのさまざまなステージをすばやくモデル化して設定できます。CodePipeline はソフトウェアの変更を継続的にリリースするために必要なステップを自動化します。
引用:AWS CodePipeline とは。 - AWS CodePipeline 引用:20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline

シンプルな使い方

CodePiplineには多様な機能がありますが、ソースステージとデプロイステージの二つだけのシンプルなパイプラインでも十分に自動化の恩恵を受けることができます。
以下にS3で作成するシンプルなパイプラインの大まかな作成手順を記載します。

  1. CloudFormationテンプレートを格納するS3バケットを作成する。

  2. CodePiplineのパイプラインを作成する。

  3. 作成したパイプラインの中で、1.で作成したソースステージを作成する。

  4. ソースステージの後続タスクとして、デプロイステージを作成する。デプロイステージの中にアクションタイプとしてCloudFormationまたはCloudFormation StackSetsを指定してアクションを作成する。アクションはCloudFormationテンプレートの数だけ作成する必要がある。

※詳細はAWS公式ドキュメントのチュートリアルを参照の事。
CodePipeline チュートリアル - AWS CodePipeline

このようなPipelineを作成しておくことで、Zipに固めたCloudFormationテンプレート群をS3にアップロードするという一回の操作だけで、事前に定義した順序通りに全てのCloudFormationテンプレートを実行してくれます。ZipをS3にアップロードし、全てのステージが緑に変わったらデプロイ完了です。

CloudFormationテンプレートによるデプロイをCodePiplelineで繰り返し実行する際のTips
  • CodePiplineを再実行した際(ZipをS3に再アップロード)にテンプレートに変更がない場合はCloudFormationの機能(CodePipelineの機能ではない)でスキップされます。具体的にはCodePipelineのアクションは成功するが、CloudFormationの各スタックの"スタックインスタンス"タブの"状況の理由"欄を確認すると「No updates are to be perfomed」と記載されています。つまり、環境構築時、全てのCloudFormationテンプレートのうち、一部だけを更新したい場合も、全てのテンプレートを固めたZipをアップロードしても問題ありません。

  • 環境構築時、全てのCloudFormationテンプレートのうち、一部だけを更新したい場合も、全てのテンプレートを固めたZipをアップロードしてください。作成済みアクションに対応するCloudFormationテンプレートがZipに含まれていない場合、当該アクションがエラーとなります。なお、エラーとなったアクション以降のアクショングループは実行されません。

  • エラーとなった場合も、完了済みのアクションがロールバックされることはありません。そのため、エラーは放っておくと割り切ってしまえばできたテンプレートから順次Zipに追加して繰り返し実行しても問題ありません。

補足説明1: ソースアクションに使用するS3のバージョニングを有効にする

ソースバケットを作成するときは、バケットでバージョニングを有効にしてください。既存の Amazon S3 バケットを使用する場合は、「バージョニングの使用」を参照して、既存のバケットでバージョニングを有効にします。
(https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/action-reference-S3.html)

補足説明2: ポーリングパイプラインを作成する際に必要となるCloudWatchEventsはCodePipeline作成時に合わせて作成するのが楽

下記の通り、 ポーリングパイプラインを作成する際の検出方法においてS3を使う場合はCloudWatchEventsの利用が推奨されています。
ポーリングパイプラインを推奨される変更検出方法に更新する - AWS CodePipeline

この時、下記を実行できるIAM権限が必要となるのですが、AWSマネジメントコンソールでCodePipeline作成時に新規IAMロールを作成可能(ラジオボタンで選択するだけ)ですので、それを利用するのが楽です。ちなみに、当該IAMロールに必要な権限は以下の通りです。
サービス:CloudWatchEvents
アクション:codepipeline:startPipelineExecution

4. CodePipeline x CloudFormationを検討している方に是非実施していただきたいTips

冒頭でも述べましたが、パイプラインによる自動化の恩恵を得るためには、テンプレートファイルの記載方法やCodePipelineの定義方法などに工夫が必要です。ここではそれら工夫点を紹介します。

CloudFormationテンプレートに関するTips

CloudFormationテンプレートはリソースのライフサイクルに合わせて分割する

以下のように、AWS環境内のリソースは用途によって作成から削除までのライフサイクルが異なります。ライフサイクルが異なるリソースを同じCloudFormationテンプレートに記載してしまうと、スタックの変更・削除が容易には行えなくります。例えば頻繁に設定変更されるEC2と監査用のログを補完するS3やログ管理サーバ(EC2)を同じCloudFormationテンプレートに記載していると、EC2変更時に意図せず別のリソースの設定を変更してしまうリスクが発生します。設定変更の影響範囲、環境変更作業が複雑になってしまうため、ライフサイクルごとにテンプレートは分離しましょう。

  • 監査用のログを補完するS3やログ管理サーバ(EC2)

  • 一時的な性能不足を補うスポットインスタンス(EC2)

  • AWSアカウント内のNWハブとしての役割を担う Transit Gateway

クロススタックリファレンスを利用する

CloudFormationテンプレートを複数に分割した場合、VPC ID・サブネットID・ELBのARN等の自動生成されるIDを後続のテンプレートでも利用できるようにする工夫が必要です。 クロススタックリファレンスを利用することで、先行テンプレートで作成された値を後続テンプレートで参照可能となります。 また、Mappingセクションを使ってクロススタックリファレンスの可読性を高めましょう。
例:
KMSを作成するCloudFormationテンプレート

  ~~略~~
Outputs:
  KMSKeyID:
    Value: !Ref KMSKey <- KMSのKeyIDを組み込み関数Refで取得
    Export:
      Name: KMSKeyID  <- 後続テンプレートで利用可能となるようKMSKeyIDをエクスポート

KMSを使用する後続のCloudFormationテンプレート

Mappings:
  CrossStackReference:
    KMSStack:
      KeyID: KMSKeyID <-KMSを使用するテンプレートのKeyIDにエクスポートしていたKMSKeyID を受け渡す。

参考:
AWS CloudFormation テンプレートのスタックにわたるリソースを参照する

Ref - AWS CloudFormation

Mappings - AWS CloudFormation

注意: OutputsはNoEcho属性を指定してもマスクされませんので、センシティブな情報を取り扱うことは避けましょう。 センシティブな情報を扱う場合は、AWS Secrets Managerを使用してください。

パラメータ - AWS CloudFormation

自動作成されるリソースもCloudFormation管理下に置くことを意識する

AWSリソースの中には、明示的に作成をしていなくてもバックエンドで自動的に作成されるものがあります。
例: RDSをCloudFormationで作成する場合、EnableCloudwatchLogsExportsの設定によりCloudWatchLogsに自動的にロググループが作成されます。
AWS::RDS::DBInstance - AWS CloudFormation


EnableCloudwatchLogsExportsによりバックエンドで自動作成されるロググループには以下の注意点があります。

  • 当該CloudFormationテンプレートに紐づくスタックを削除した場合、RDSは削除されるがロググループは削除されない。

  • 自動作成されたロググループと同名のロググループの作成ができないため、スタック削除→再作成を行う場合エラーとなる。

  • バックエンドで自動作成されたロググループの設定はCloudFormationテンプレートに記載されていないため、設定変更(例えば保持期間など)をCloudFormationで変更できない。実施したい場合は、一度既存リソースのインポートを行う手間が発生する。

-> 解決策:ロググループを作成する別のCloudFormationテンプレートを用意し、RDSを作成するCloudFormationテンプレートを実行する前に、予めロググループを作成しておくことを推奨します。

また、 CloudFormationテンプレートで環境構築する場合には、原則明示的にテンプレートにリソースを定義することを心掛け、バックエンドで自動作成されることを避けましょう。自動作成されたリソースはいつどのタイミングで作成されたのかが分かりづらく、開発や運用に支障が出る可能性があります。また、バックエンドで自動作成されたものは、別途インポートなどの作業をしない限り、CloudFormationのスタック作成/削除の操作での管理や設定変更ができないため、環境変更に複数のインターフェース(CouldFormationとマネジメントコンソール)が必要となり運用作業が煩雑になります。

VPCフローログとCloudWatchLogsのロググループのテンプレートは分離する

以下のようにVPCフローログとCloudWatchLogsのロググループは一つのテンプレートに定義し、同じスタック内で作成することが可能です。 しかし、このスタックを削除するとCloudWatchLogsのロググループが削除されないという事象が発生します。

VPCFlowLog:
  DependsOn: LogGroup
  Type: AWS::EC2::FlowLog
  Properties: 
     LogGroupName: VPCFlowLogName
  ~~略~~

LogGroup:
  Type: AWS::Logs::LogGroup
  Properties: 
     LogGroupName: LogGroupName
  ~~略~~
CloudWatchLogsのロググループが削除されない原因

スタック削除時にはVPCフローログとCloudWatchLogsのロググループともに直ぐに削除されますが、実はVPCフローログのデータ収集が中止されるまでに数分を要します。そのため、裏側では削除後もVPCフローログをCloudWatchLogsに送信する処理が動いており、結果として一度削除されたCloudWatchLogsのロググループ自動作成されるという挙動となります。

対処方法
  • VPCフローログとCloudWatchLogsのロググループのテンプレートは分離する。

  • CodePipelineでアクションを定義する際は、CloudWatchLogsのロググループのテンプレートの後にVPCフローログのテンプレートがデプロイされるようにRunOrderを調整する。

  • 削除時はVPCフローログとCloudWatchLogsのロググループの削除の間に数分の間隔を設ける。

CodePipelineに関するTips

CodePipelineのアクションはCloudFormationテンプレートで定義する

CodePipelineアクションの設定を全てAWSマネジメントコンソールで行おうとすると、数十個あるアクションを何度も何度も手作業で行う必要があります。しかし、アクションをCloudFormationでデプロイしてしまえば、この煩わしい作業が軽減できます。
CodePipelineのCloudFormationテンプレートは以下のような構造となっています。
デプロイステージのActionsはCloudFormationテンプレートの数の分だけ定義が必要となりますが、以下のコメントで示した一部のパラメータを変更する必要こそあるものの、基本的にはCopy&Pasteで簡単に複数のActionを定義することができます。基本的にはName,StackName,Namespace,RunOrderの4つを変更すればOKです。AWSマネジメントコンソールで行うよりも効率的にミスなく定義できるのではないでしょうか。

Type: AWS::CodePipeline::Pipeline
Properties: 
  ArtifactStore: 
    ArtifactStore
  ArtifactStores: 
    - ArtifactStoreMap
  DisableInboundStageTransitions: 
    - StageTransition
  Name: String
  RestartExecutionOnUpdate: Boolean
  RoleArn: String
  Stages: 
      # ソースステージ
      Name: String
      Actions: 
            Name: String
            ActionTypeId: ActionTypeId
            configuration: Json
            InputArtifacts: 
                - InputArtifact
            Namespace: String
            OutputArtifacts: 
                - OutputArtifact
            Region: String
            RoleArn: String
            RunOrder: Integer
            Blockers: 
                - BlockerDeclaration
      # デプロイステージ
      Name: String
      Actions: # デプロイステージのActions部分をCloudFormationテンプレートの数だけCopy&Paste
            Name: String # わかりやすさのため一意になるように定義
            ActionTypeId: ActionTypeId
            configuration:
                ActionMode: CHANGE_SET_REPLACE
                Capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
                ChangeSetName: pipeline-changeset
                RoleArn: CloudFormation_Role_ARN
                StackName: my-pipeline-stack  # 一意になるように定義
                TemplateConfiguration: 'my-pipeline-stack::template-configuration.json'
                TemplatePath: 'my-pipeline-stack::template-export.yml'
            InputArtifacts: 
                - InputArtifact
            Namespace: String # 必要に応じてAction毎に変更。私は普段CloudFormationテンプレートと一対一で対応づくように定義している。
            OutputArtifacts: 
                - OutputArtifact
            Region: String
            RoleArn: String
            RunOrder: Integer # CloudFormationテンプレートの実行順序を定義
            Blockers: 
                - BlockerDeclaration
  Tags: 
    - Tag
(参考:[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html])

CodePipelineのアクションの順序(RunOrder)はガントチャートで整理する

CodePipelineのアクションの順序の定義こそ、CodePipelineでCloudFormationテンプレートを実行することの醍醐味です。しかし、各テンプレート毎の依存関係を正しく把握し、無駄なく最適な解を見つけることは容易ではありません。そこで、ガントチャートを使用しましょう。実施すべきことは、シンプルに以下を実施するだけです。

  1. 全てのCloudFormationテンプレートをタスクとして入力する。

  2. 各テンプレートの前に実行されていなければならないテンプレートの番号を先行タスクとして入力する。

以下の図は投稿用にガントチャートExcelで模したものですが、MSプロジェクトなどを使えば簡単に実行順序の最適化が可能です。このように、各テンプレートのRunOrderに設定すべき値(※)がガントチャートから一目瞭然でわかります。※以下の図では1~7の数字がRunOrderに設定する値

パイプラインのアクション名は短い名前にする

CodePipelineのアクション名はマネジメントコンソールで表示した場合、15文字程度しか表示されません。そのため、数の左側のような命名規則であれば問題ないのですが、右のように「システム名-環境名-リージョン名-アクション名-XX」の様な長い名称にしてしまうと、画面上から何のアクションが実行されたのかが判別できなくなってしまいます。アクション名は短くするか、海外の住所表記と日本の住所表記の違いの様によくある命名規約を逆順にするなどの工夫が必要です。 元画像の引用元:https://aws.amazon.com/jp/blogs/aws/codepipeline-update-build-continuous-delivery-workflows-for-cloudformation-stacks/

CloudFormationアクションとCloudFormationスタックセットアクションの機能差分

CodePipelineでCloudFormationスタックをデプロイする際、CloudFormationアクションとCloudFormationスタックセットアクションの二つのオプションを使用可能です。ここでは二つのアクションの主な差分を紹介します。CloudFormationスタックセットについて詳しくない方は、まずは以下の参考をご参照ください。 参考:AWS CloudFormation StackSets の操作 - AWS CloudFormation

CloudFormationアクション
  • 指定可能なアクションモード:"スタックを作成または更新する","スタックを削除する","故障したスタックを取り換える","変更セットを作成または交換する","変更セットを実行する"

  • 別リージョンへのスタック作成:CodePipelineでリージョンを指定可能。1アクションにつき1リージョン指定可能(デプロイ対象リージョンが複数ある場合はその分アクションを用意する)。

  • 別アカウントへのスタック作成:不可

CloudFormationスタックセットアクション
  • 指定可能なアクションモード:特になし(単純にスタックを作成または更新する事しかできない。)

  • 別リージョンへのスタック作成:アクションを動作させるリージョンとデプロイ先のリージョンを指定可能。1アクションで複数リージョン指定可能。

  • 別アカウントへのスタック作成:指定可能。1アクションで複数アカウント指定可能。

二種類のアクションの選び方
  • 豊富なアクションモードの利用が必要な場合:CloudFormationアクション

  • 複数アカウントにデプロイが必要な場合:CloudFormationスタックセットアクション

  • 複数リージョンへのデプロイが必要な場合:どちらでも可能。ただし、CodePipelineの配置リージョン、CloudFormationスタックのデプロイ先リージョン、アクションプロバイダの組み合わせを考えて、構築自動化のためのアーキテクチャを検討する必要があります。

    例:
    パターン1. アクションプロバイダにCloudFormationアクションを使用して、リージョン毎にCodePipelineを構築する。
    パターン2. アクションプロバイダにCloudFormationアクションを使用して、あるリージョンのCodePipelineから複数のリージョン上の環境を構築する。
    パターン3. アクションプロバイダにCloudFormationスタックセットアクションを使用して、あるリージョンのCodePipelineから複数のリージョン上の環境を構築する。

ただし、一部Codepipelineが未対応のリージョン(大阪リージョン等)あるため、その場合はCloudFormationスタックセットアクションを使う必要があります。例えば、コスト削減などを目的に通常時は大阪リージョンのDR環境/開発環境を停止しておいて、必要な時だけ環境を自動構築するといった事をしたい場合、東京リージョンのCodePipelineからCloudFormationスタックセットアクションを使って大阪リージョンの環境を構築するといったことをご検討ください。

【IAM】 CodePipelineのCloudFormationスタックセットアクションを使用する際のTips

自動作成されるCodePipeline用のIAMロールはさらに権限を絞る

ここでは、ソースをS3とするCodePipelineを作成する際のCodePipeline用のIAMロール(CodePipelineのRoleArnに設定)を紹介します。 CodePipeline用のIAMロールは、AWSマネジメントコンソールでCodePipelineを作成する際に新規作成可能(ラジオボタンで選択するだけ)ですが、ここで紹介しているIAMポリシーは権限を最小にするためより厳しいポリシーにしていますので、参考にしてください。
サービス:CodePipeline
アクション:

  • ソースS3バケットの参照権限/アーティファクト出力用S3バケットの更新権限(アクション:"s3:*")

  • CloudFormationスタックセットの作成権限(アクション:"cloudformation:*")

  • CloudFormationにAWSCloudFormationStackSetAdministrationRoleをパスするための権限(アクション:"iam:PassRole")

  • KMSのDecrypt権限(アクション:"kms:Decrypt")※KMSでS3を暗号化している場合のみ

  • KMSのGenerateDataKey権限(アクション:"KMS:GenerateDataKey")※KMSでS3を暗号化している場合のみ

CodePipelineのCloudFormationスタックセットアクションを使用する場合IAMロールの名称に指定がある

以下の通り、指定の名前でCodePipelineの各アクションのAdministrationRoleArnとExexutionRoleNameにロールを作成する必要があります。

管理者アカウントのロールは AWSCloudFormationStackSetAdministrationRole という名前にする必要があります。各ターゲットアカウントのロールは AWSCloudFormationStackSetExecutionRole という名前にする必要があります。(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html)

5. まとめ

  • CodePipelineによりCloudFormationテンプレートのデプロイを自動化する際のTipsを紹介しました。

  • CloudFormationテンプレートの数だけ手作業でスタックを手動作成する苦労と比較すると、大きく手間が削減されるはずです。また、CodePipeline画面で成功/失敗が一目でわかるようになるメリットもあります。

  • さらに、S3にZipをアップロードするひと手間で環境構築ができるようにすることで、開発時は環境を削除しておくことが可能となり、コスト削減も見込めます。

【SAP on AWS】AWS上でSAPを稼働させる際の環境制約とAWSへの移行ツールの特徴

1. 概要

本投稿では、SAP on AWSに関して、主にAWS上でSAPを稼働させる際の環境制約とAWSへの移行ツールの特徴を記載しています。実際の移行案件において発生しがちな想定外の仕様制約による手戻りのリスクを低減できたらと考え記載しました。


[対象読者]
SAP on AWSに関する基本的な用語を把握している方
AWSの主要サービスの仕様を把握されている方

注)AWS公式ドキュメントやインターネットから拾い集めた情報を個人的に解釈した結果を記載しています。実機確認等による裏付けがされた内容ではない点、ご留意ください。

2. 制約  

SAP on AWSには、AWS上でSAPを稼働させることならではの順守すべき制約があります。
特に、 AWS上でサポートされるDBとOSの組み合わせは要注意です。オンプレミスでサポートされていたDBと各バージョンはAWS上でもサポートされます。しかし、 AWS上ではサポートされるDBとOSの組み合わせに制約が有り、オンプレミスで利用できていたDBとOSの組み合わせの一部はAWSではサポート不可の組み合わせとなってしまう点は要注意ポイントです。
詳細については下記をご参照ください。

2-1. SAP on AWSで利用可能なOSとDBの種類

2-1-1. Supported Operating Systems

EC2 instances run on 64-bit virtual processors based on the Intel x86 instruction set. The following 64-bit operating systems and versions are available and supported for SAP solutions on AWS.

SAP on AWS Planning - General SAP Guides

2-1-2. Supported Databases

All the database platforms and versions supported by SAP for an on-premises infrastructure are also supported by SAP on AWS. For details about the databases supported with specific SAP solutions on AWS, see SAP Note 1656099.

SAP on AWS Planning - General SAP Guides

2-1-2-1. SAP HANA on AWS

Operating System for Deployment - SAP HANA on AWS

2-1-2-2. Oracle

Oracle for SAP on AWS is supported on an OEL OS.

Prerequisites - SAP NetWeaver on AWS

2-2. SAPサポートを受けるために順守すべき構成

  • Amazon CloudWatchの詳細モニタリングが有効であること
  • AWS Data Provider for SAPがインストール・構成済みであること
  • Business Support または Enterprise SupportレベルのAWSサポートプランであること

docs.aws.amazon.com

2-3. Overlay IP

Overlay IPアドレスVPCに設定しているIPアドレスレンジの外側のIPアドレスを使用する必要があります。 catalog.us-east-1.prod.workshops.aws

3. 移行

3-1. 移行の種類

Homogeneous migration と Heterogeneous migrationという2種類の移行の考え方があります。 Homogeneous migration ではOS,SAP,DBがソース環境とターゲット環境で同じであることが要求されます。Heterogeneous migration はそれらを変更しながら移行する事を意味します。

Migrate and optimize SAP S/4HANA on AWS - AWS Virtual Workshop - YouTube

3-2. 移行ツールの選び方

Export,Copy,Provisioning,Importの4つの移行のポイントでそれぞれなんのツールを使用するべきか検討が必要です。 以下の図がわかりやすく情報を整理してくれているので、この図を基に検討するのが良いと思います。
Migrate and optimize SAP S/4HANA on AWS - AWS Virtual Workshop - YouTube

ここでは、主な移行ツールについて、選ぶ際のTipsを簡単に紹介します。

3-2-1. Export/Import

3-2-1-1. 大雑把な選び方

移行ツールは大きく分けてAWSが提供するツールとSAPが提供するツールがあります。 基本的にHeterogeneous migrationを行いたい場合は、SAPが提供するツールが候補になります。

3-2-1-2. システム移行
3-2-1-2-1. AWS Application Migration Service (CloudEndure Migration) ,AWS Server Migration Service (AWS SMS)

既存の環境のシステムイメージをそのままAWSへコピーしたい場合(Homogeneous migration)、これらのツールが候補になります。
以下の記載の通り、 Application Migration Serviceの使用が推奨されています。ただし、AWS SMSにはエージェントlessで使用可能という特徴があるため、既存システムのセキュリティ要件などによりエージェントの導入ができない場合は、AWS SMSを使用します。

AWS Application Migration Service (AWS MGN) は、AWS へのリフトアンドシフト移行に推奨される主要な移行サービスです。現在 Server Migration Service (SMS) を使用しているお客様には、将来の移行のために Application Migration Service に切り替えることをお勧めします。
AWS Server Migration Service(AWS へのオンプレミスサーバーの移行)| AWS

3-2-1-2-2. Software Provisioning Manager(SWPM)

Heterogeneous システムコピーに使用するツール。
ソースシステムからのエクスポートと、ターゲットシステムへのインストールを行ってくれる。 blogs.sap.com

3-2-1-3. データベース移行
3-2-1-3-1. SAP HANA System Replication(HSR)
  • SAP HANAからSAP HANAへのレプリケーション
  • 移行時にシステム停止がほとんど許容できない場合の最有力候補。
  • スケールアウト,スケールアップしたターゲットDBへのレプリケーションも可能。
3-2-1-3-2. Database Migration Option (DMO) of SUM
  • AnyDB(DB2,Oracle,SQL Server等)からSAP HanaへのMigrationが可能。
  • ターゲット環境はあらかじめAWS Launch Wizardによりプロビジョニングされている必要がある。
  • DMOによりExportされたデータはAmazon S3 Multi-Part Upload, AWS Storage Gateway(File Gateway),AWS DataSyncにより転送する必要がある。
3-2-1-3-3. Backup/Restoreによる移行(Amazon S3 Multi-Part Upload, AWS Storage Gateway(File Gateway))

主にBackup/Restoreにより移行する際に使用する手法です。
AWSが公開しているYouTubeでは、Homogeneous migrationにS3を使用した方法が紹介されています。
Migrate and optimize SAP S/4HANA on AWS - AWS Virtual Workshop - YouTube

AWSのブログではStorage Gateway(File Gateway)を使用した方法が紹介されています。
Integrate an SAP ASE database to Amazon S3 using AWS Storage Gateway | AWS Storage Blog

その他、データのサイズが大きい場合はSnowballの利用を検討します。

3-2-2. Copy

  • Amazon S3 Multi-Part Upload, AWS Storage Gateway(File Gateway),AWS DataSync,Snowballといった選択肢があります。(各サービスの使い分けについては割愛)

3-2-3 Provisioning

基本的にはAWS Launch Wizardを使用することがベストプラクティスです。その他、制約で記載した内容に注意してプロビジョニングしましょう。

  • 事前にProvisioningに必要なSAP資材をダウンロードし、S3にアップロードしておくこと。(Launch Wizardにてパスを指定する。)

  • AWS環境作成のためCloudFormationテンプレートを用意すること。

  • AWS Launch Wizardは完了までに数時間かかるため、DRのシナリオでRPOに制約がある場合は事前に環境構築しておくこと。

4. まとめ

  • Export,Copy,Provisioning,Importの4つの移行のポイント毎に移行戦略を検討します。

  • Export/Importでは、Homogeneous migration と Heterogeneous migrationのどちらの移行を行うのかを決め、それを実現できるルールを選定する。Heterogeneous migrationを行いたい場合は基本的にはSAPが提供するツールが候補になります。

  • CopyではAmazon S3 Multi-Part Upload, AWS Storage Gateway(File Gateway),AWS DataSync,Snowballといった選択肢があります。

  • Provisioningは基本的にはAWS Launch Wizardを使用すればよいが、制約で記載した内容に注意が必要です。

【AWS】インドのテストセンターでAWS認定試験を受験

はじめに

先日、インドのテストセンターでAWS認定試験を受験しました。
意外と普通だったのですが、貴重な体験だと思いましたので記事にしてみました。

申し込み

日本のテストセンターで受験する場合と流れは同じです。
<大まかな流れ>

  1. AWS認定ページへのログイン
  2. 受験する認定試験を選択
  3. 受験地選択。ここで国名と都市名を選択します。私が滞在しているインドの某都市では3か所程度テストセンターが存在していました。
  4. 受験日を選択。日本では一日のうち何枠もの選択肢がありましたが、私が選択したテストセンターでは一日一枠しかありませんでした。
  5. 支払い

当日

テストセンターの外観は写真の通りです。
日本のテストセンターも場所によってはただの雑居ビルに入っていますので、個人的にはそんなに違和感はありませんでした。ちなみに、写真内の扉は実はエレベーターです。信頼性に不安を感じたため階段をつかいました。


テストセンターの中は意外と普通でした。
日本のテストセンターとほぼ同じ流れで、同意書へのサイン、写真撮影、本人確認がされます。おそらくピアソンさんの徹底した世界中で統一された規則があるのでしょう。
私の場合、本人確認は現地の身分証明書を使いましたが、パスポート+クレジットカードでも問題ないと思います。 ※気が引けたので、テストセンターの内観の写真撮影はしませんでした。

テスト自体も日本のテストセンターで受験するのと同じ様に、少し古いデスクトップPCで違和感なく受験できました。

テスト後

日本のテストセンターでは試験後に紙をもらえると思いますが、インドではそういったものはありませんでした。

最後に

面白い事が起きることを期待してあえて自宅ではなくインドのテストセンターで受験してみましたが、インドのテストセンターは驚くほど普通で、日本と変わらず受験ができました。
強いて違いをいうのであれば、受付のおじさんが非常にフレンドリーだった事です。
試験前は"がんばれよ”と声をかけてくれ、試験後は"どうだった?受かったか?"と聞いてきて、"合格した"と答えると"Congratulations"と握手してくれました。

以上、インドのテストセンターでAWS認定試験を受験するという貴重な体験を記載してみました。

【AWS】Former2をローカルでホストする際のブラウザ(chrome)拡張機能の利用

概要

既存AWSリソースをスキャンしてCloudFormationテンプレートを生成するOSSツールである”Former2”をローカルでホストする際のブラウザ拡張機能に関するTipsを紹介します。

Former2自体の紹介は、以前ブログ執筆した下記ブログに記載していますのでここでは割愛します。
参考:Former2とは
【AWS】Former2を安全に使うための3つの工夫 - Vの技術ブログ

記載内容

  1. Former2のブラウザ拡張機能
  2. ローカルでホストする際のブラウザ拡張機能の利用
  3. ローカルでホストしたFormer2を複数端末で利用する際のTips

1.Former2のブラウザ拡張機能

Former2の利用形態には、Webサービス(https://former2.com)を利用する形態と、自身のローカル環境にホストして利用する形態があります。 ここでは、まずWebサービスを利用する形態におけるブラウザ拡張機能について紹介します。

Former2で既存リソースをスキャンする際、CORS(Cross-Origin Resource Sharing)が必要なリソース(S3, IAM等)の場合、ブラウザ拡張機能のインストールが必要です。 f:id:VbuiV:20220325221740p:plain 引用:https://former2.com/#section-setup-introduction

Webサービスとして提供されているFormer2を利用する場合は、ブラウザ拡張機能の利用は簡単です。
例えばchromeの場合、chromeウェブストアから追加するだけです。 f:id:VbuiV:20220325221809p:plain 引用:Former2 Helper - Chrome ウェブストア

2.ローカルでホストする際のブラウザ拡張機能の利用

ここではローカルにホストして利用する形態におけるブラウザ拡張機能について紹介します。 ローカルにホストして利用する方法については下記の記事を参照してください。

参考:Former2をdockerでホストする
【AWS】Former2を安全に使うための3つの工夫 - Vの技術ブログ

Former2をローカルにホストして利用する場合の注意点として、公式GitHubには以下の記載があります。

Extension support will also be available if you host on 127.0.0.1 or localhost, otherwise you can modify the extension as needed.
引用:https://github.com/iann0036/former2

上記注意点の通り、Former2を動作させるサーバとアクセス元の端末が異なる場合、chromeウェブストアからではなく、GitHubで公開されているソースからブラウザ拡張機能を読み込む必要があります。

ソースからブラウザ拡張機能を読み込む手順(chrome)


  1. Former2 HelperをGitHubからダウンロードしたうえで、"パッケージ化されていない拡張機能を読み込む"から読み込む。読み込んだ際に生成される"Extension ID"をメモする。 f:id:VbuiV:20220325221831p:plain 参考:Former2 Helper
    GitHub - iann0036/former2-helper: A browser extension to help avoid CORS issues for former2.com

  2. manifest.jsonにURLを追加する。(Former2をホストするサーバと利用端末が異なる場合) f:id:VbuiV:20220325221903p:plain 引用:https://github.com/iann0036/former2/blob/master/HOSTING.md

  3. 先ほどメモしたExtension IDを使ってjs/app.jsを修正する。 f:id:VbuiV:20220325221851p:plain 引用:https://github.com/iann0036/former2/blob/master/HOSTING.md


3.ローカルでホストしたFormer2を複数端末で利用する際のTips

ローカルでホストしたFormer2を複数端末で利用する際、上述の"js/app.jsのExtension IDを修正する"が曲者です。

chromeのExtension IDは読み込んだ際に生成されます。このExtension IDがjs/app.jsに記載したものと異なるとブラウザ拡張機能は利用できません。 これが、一台のサーバにForemr2をホストして複数の端末から利用する場合に問題となります。

f:id:VbuiV:20220325221917p:plain

そこで、複数の端末でExtension IDを揃える方法をここでは紹介します。


パッケージ化されていない拡張機能のExtension IDがどのように生成されているのかを検索した結果、絶対パスのSHAハッシュ値であるという記載を見つけることができました。

参考:アンパックされた拡張機能のChrome拡張機能IDはどのように生成されますか? - CODE Q&A

参考:Chromium Code Search
https://source.chromium.org/chromium/chromium/src/+/main:components/crx_file/id_util.cc

つまり、どの端末でも同じ階層(絶対パス)に格納したうえで拡張機能として登録することで、Extension IDが揃うということになります。 私の手元の複数端末で確認しましたが、絶対パスが同じであれば、常にExtension IDは同じでした。 これで、一つのサーバにFormer2をホストして、複数端末でアクセスする形態にしたとしても、どの端末でもブラウザ拡張機能が利用可能となります。

【AWS】SSM Port ForwardingによるFTP,rsyncの並列転送

概要

AWS System Manager Sessions Manager Port Forwarding(以降SSM Port Forwarding)を使用して、FTPrsyncで並列ファイル転送を行う方法を紹介します。

SSM Port Forwardingにより、ローカル端末とEC2間に確立されるSSM Session Manager Tunnelを使って、セキュアにファイル転送を行う事が可能となります。 しかし、SSM Port Forwardingの特性上、ポートが動的に変化するFTPパッシブモードや、複数ポートによる並列転送を行う場合、通信を確立するために工夫が必要となります。

本記事では、そのようなケースで必要となる設定上の工夫について説明します。

記載内容

  1. SSM Port Forwardingとは
  2. SSM Port Forwarding設定方法
  3. SSM Port ForwardingでFTP(pasv)を使うための工夫
  4. SSM Port Forwardingでrsyncを並列転送するための工夫
  5. Appendix 参考リンク

1.SSM Port Forwardingとは

SSM Port Forwardingは、ローカル端末とプライベートサブネットにデプロイされたインスタンス間にトンネルを安全に作成できる機能です。これにより、ローカル端末とEC2間で、SSH、RDP、FTP等の多様な通信が可能となります。 例えば、下記の様にプライベートサブネットにデプロイされたEC2へアクセスする際に、踏み台サーバが不要になります。

踏み台を使ったアクセス方法

f:id:VbuiV:20220324223512p:plain

SSM Port Forwardingアクセス方法

f:id:VbuiV:20220324223530p:plain

2.SSM Port Forwarding設定方法

SSM Port Forwardingを行うために必要な手順を説明します。 f:id:VbuiV:20220324223554p:plain

準備

①EC2とSSMとの間でHTTPS通信を行うためのVPCエンドポイントを作成します。

  • ①-1.VPCとプライベートサブネットを作成します。

    • VPCのenableDnsSupportとenableDnsHostnamesは有効にする
  • ①-2.VPCエンドポイントにアタッチするセキュリティグループAを作成します。

    • InboundでEC2からのHTTPS通信を許可
  • ①-3.下記VPCエンドポイントを作成し、セキュリティグループAをアタッチします。

    • "com.amazonaws.<リージョン>.ssm
    • "com.amazonaws.<リージョン>.ssmmessages
    • "com.amazonaws.<リージョン>.ec2
    • "com.amazonaws.<リージョン>.ec2messages

②EC2でAWS SSMを利用する準備を行います。

  • ②-1.セキュリティグループBを作成します。
    • OutboundでVPCエンドポイント(セキュリティグループA)へのHTTPS通信を許可
  • ②-2.EC2を作成し、セキュリティグループBをアタッチします。
  • ②-3.SSMエージェントを導入します。(AWS提供のAMIを利用する場合は不要)

③以下のマネージドポリシーを付与したIAMロールを作成し、EC2にアタッチします。

④Client側にAWS CLIとSession Manager pluginをインストールします。

接続

Clientのコマンドプロンプトで、"aws configure"コマンドで必要な設定をした後、以下のコマンドを発行し、EC2とのセッションを確立します。
※Client側のlocalPortNumber(任意)とEC2側のportNumber(sshなら22,RDPなら3389)でセッションが確立されます。

aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=<port>,localPortNumber=<port>"

例:Tera TermでSSHをする場合は上述のコマンド実行時に"portNumber=22"を指定します。Tera Termの"TCPポート#(P):"には"localPortNumber"で指定した任意ポートを入力します。

f:id:VbuiV:20220324223655p:plain

3.SSM Port ForwardingでFTP(pasv)を使うための工夫

FTPとはデータ転送用のプロトコルです。

詳細は割愛しますが、FTPにはアクティブモードとパッシブ(pasv)モードの二つのモードがあり、パッシブ(pasv)モードは制御用に21番ポートを使用し、データ転送用のポートはランダムに設定されます。

一方、SSM Port Forwardingはサーバ側とクライアント側のポートを一つ一つ対応付けていくため、FTP(pasv)のようにランダムにポートを使用するプロトコルを使用する場合には、ランダムに使用される全てのポートで事前にトンネルを作成しておくといった工夫が必要になります。

ポイント

◆データコネクションで使用するポートを制限する。
aws ssm start-sessionコマンドで必要な数のデータコネクションを確立する。

アーキテクチャのイメージ

f:id:VbuiV:20220324223636p:plain

本記事で使用しているソフトウェア

  • クライアント:Windows10 , FFFTP(ver2.00)
  • サーバ:RHEL7.6 , vsftpd 3.0.2
    ※インストールやセットアップ方法は世の中にあふれていると思うので、割愛します。

FTP(pasv)の設定例

  1. サーバ(vsftpd.conf)の設定
    aws ssm start-sessionコマンドでポート指定する必要があるため、使用するデータ転送用ポートを制限します。

    • 設定ファイル例(抜粋)※データ転送用ポート範囲
     pasv_min_port=40000
     pasv_max_port=40003
    
  2. 並列度数分のセッションを張る
    制御用ポートおよびデータ転送用として使用するポート数分のセッションを張ります。

    • コマンド実行例(制御用)
      ※portNumber,localPortNumberはお使いの環境に応じて変更してください。
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=21,localPortNumber=21"
    
    • コマンド実行例(データ転送用)
      ※portNumber,localPortNumberはお使いの環境に応じて変更してください。
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40000,localPortNumber=40000"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40001,localPortNumber=40001"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40002,localPortNumber=40002"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40003,localPortNumber=40003"
    
  3. クライアント(FFFTP)で並列実行
    FFFTPは1プロセスで4セッションまで並列転送可能です。[特殊機能]タブ - [最大同時接続数]で指定。
    ※さらに並列度を上げる場合は、FFFTP自体を複数起動してください。

4.rsyncの設定方法

FTPと同様に、rsyncでもSSM Port Forwardingを用いた転送が可能です。
リモートでrsyncする場合、sshを使用するケースも多いですが、本投稿ではサーバのrsyncdに複数ポートを使用して並列転送を行う方法を紹介します。

ポイント

◆並列転送のために、rsyncdを複数異なるポートで起動する。その際、pidファイルの重複を避ける。
aws ssm start-sessionコマンドで必要な数のコネクションを確立する。

アーキテクチャのイメージ

f:id:VbuiV:20220324223720p:plain

本記事で使用しているソフトウェア

  • クライアント:Windows10 , rsync 3.1.3 , cygwin 3.2.0
  • サーバ:RHEL7.6 , rsync 3.1.2
    ※インストールやセットアップ方法は世の中にあふれていると思うので、割愛します。

rsyncで並列転送するための設定例

  1. サーバの設定と起動
    設定ファイル間でのプロセスIDファイルとログファイル名の重複を避けつつ、多重度数分の設定ファイルを作成します。

    • 設定ファイル例(抜粋)
      ※並列実行したい分だけファイルを複製してください。

    設定ファイル1: rsync1.conf

      pid file = /var/run/rsyncd1.pid
      log file = /var/log/rsyncd1.log
      [testrsync]
          path = /tmp
    

    設定ファイル2 :rsync2.conf

      pid file = /var/run/rsyncd2.pid
      log file = /var/log/rsyncd2.log
      [testrsync]
          path = /tmp
    

    待ち受けポート番号をオプションとしたrsyncを、デーモンモードで並列実行します。

      rsync --daemon --config=/etc/<設定ファイル> --port=10873
      rsync --daemon --config=/etc/<設定ファイル> --port=10874
    
  2. 多重度数分のセッションを張る

    • コマンド実行例
      ※並列実行したい分だけコマンドを実行してください。
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=10873,localPortNumber=10873"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=10874,localPortNumber=10874"
    
  3. クライアントでのrsync並列実行

    • コマンド実行例
      ※並列実行したい分だけコマンドを実行してください。
      rsync -av --progress --port=10873 --password-file=./rsyncd.passwd (※1) ./test1.txt (※2) rsync://rsync_user(※3)@localhost/testrsync (※4)
      rsync -av --progress --port=10874 --password-file=./rsyncd.passwd (※1) ./test2.txt (※2) rsync://rsync_user(※3)@localhost/testrsync (※4)
    
      ※1 サーバに作成したユーザのパスワードファイル
      ※2 転送するファイル
      ※3 サーバに作成したユーザ
      ※4 サーバの設定ファイルに記述したモジュール(転送ファイルは、サーバ設定ファイルの "path=" に格納されます)
    

5.Appendix 参考リンク

【AWS】今年度学習したAWSサービスの特徴をまとめておく - AWS Machine Learning編

概要

インフラ系のクラウドエンジニアとして、日々自己研鑽に努めています。 本投稿は今年度の学習のまとめとして、今後も覚えておきたい情報を記載したものです。 Machine Learningに含まれるサービスの特徴と効果的に活用するためのTipsを記載しています。また、サービスを利用するときに必要となる一般的な機械学習に関するナレッジも用語集的に整理しています。

記載内容は、AWS公式ドキュメントやインターネットから拾い集めた情報を個人的に解釈した結果を記載しています。実機確認等による裏付けがされた内容ではない点、ご留意ください。また、私は機械学習エンジニアではないため、特に"一般的な機械学習に関するナレッジ"はおおよそのイメージで記載しており、正確性に欠ける記載が多いかもしれません。あらかじめご了承ください。

AI services

Forecast

Lex

  • チャットボット

Personalize

Polly

  • テキストの読み上げサービス。以下の機能を有する。
    • NTTS:より人間に近い音声で発話
    • スピーチマーク:テキストからメタデータを取得。読み上げた単語のハイライトやアニメーションの口の動きなどに使えるらしい。
    • SSML:ボリュームと話す速度の調整
    • Lexicon:発話(utterance)のカスタマイズ

Rekognition

  • 画像分析及び動画分析を行うサービス。
  • 動画分析では、S3に保存された動画の他、ストリーミングビデオの操作も可能。
    ストリーミングビデオの処理:S3やKDSからビデオを取り込み、ストリームプロセッサーで処理。ストリーミングが完了するまでループ。 ストリーミングビデオの操作 - Amazon Rekognition

Transcribe

  • リアルタイム文字起こし。

Panorama

  • オンプレミスのカメラからリアルタイムで動画処理するサービス。

ML services

Augmented AI

人間による機械学習予測結果のレビューを行うサービス。

SageMaker

Othres

Elastic Inference

Amazon Elastic Inference (Amazon EI) は、Amazon EC2 または Amazon SageMaker のインスタンスタイプまたは Amazon ECS タスクに適切な量の GPU による推論アクセラレーションをアタッチさせる、高速コンピューティングサービスです。つまり、アプリケーションの全体的なコンピューティング、メモリ、およびストレージのニーズに最も適したインスタンスタイプを選択し、必要な推論アクセラレーションの程度を個別に構成できます。
引用:よくある質問 - Amazon Elastic Inference | AWS

Kinesis Video Streams

  • 2種類の方式がある。
    • メディア方式:プロデューサーからストリーミングにより動画を取得し、保存して分析に使用する。データストアには 内部的に S3が使用される。
    • WebRTC:リアルタイムで双方向にデータをストリーミング。クラウドに動画が保存されない。その場限りの動画配信に使う。

IoT Greengrass

Data Pipeline

  • S3,RDS,DynamoDB,EMR,Redshiftへのデータ転送やETL処理を行う。
  • オンプレミスからのデータ転送や定期的なデータアクセス機能も備える。
  • オンプレミス→S3→Redshiftといった一連のデータパイプラインの作成も可能。

DeepLens

  • 深層学習用のカメラで、ローカルで推論の実行が可能。
  • Lambdaがカメラ内に配備されている。Kinesis Video Streamsへの転送も可能。

QuickSight

  • マネージドなBIサービス
  • auto-narrativeという機能を使うと、説明文が自動生成可能。

    [auto-narrative (自動説明文)] は、チャートの代わりに説明文を表示する自然言語の要約ウィジェットです。分析中にこれらのウィジェットを埋め込んで、重要なインサイト吹き出しを強調表示することができます。結論を引き出すために、ビジュアルを調べたり、ドリルダウンしたり、値を比較したり、アイデアを再確認したりする必要はありません。また、データの意味を理解したり、さまざまな解釈について同僚と話し合ったりする必要もありません。代わりに、データから結論を推定し、それを分析に表示することができます。1 つの解釈は誰でも共有することができます。
    引用:Amazon QuickSight を使用した自動説明文の作成 - Amazon QuickSight

一般的な機械学習に関するナレッジ

データの前処理

Standardization(標準化)

  • 平均0、分散1になるようにデータの値を調整。
  • データの持つ値の大きさが異なる際に、元々の値の大きさの違いにより結果に偏りが起きないようにするために行う。 例えば、身長と体重をそのままの数値で使用したり、100点満点の試験と1000点満点の試験の値をそのまま扱うと、身長や1000点満点の試験結果など元々大きな値を持つデータに引きずられてしまう。そういった場合に使用する。
  • その他、外れ値がある場合にも利用する。

Normalization(正規化)

  • 0~1の間になるようにデータの値を調整。
  • データの持つ値の大きさが異なる際に、元々の値の大きさの違いにより結果に偏りが起きないようにするために行う。 例えば、身長と体重をそのままの数値で使用したり、100点満点の試験と1000点満点の試験の値をそのまま扱うと、身長や1000点満点の試験結果など元々大きな値を持つデータに引きずられてしまう。そういった場合に使用する
  • 外れ値がある場合は適さない場合がある。例えば、100個の値のうち99個は1~10の間だが、1つだけ100といったケースで0~1に正規化すると、外れ値が大きな影響力を持ってしまう。

欠損値への対処

  • 他の値から導き出される適切な値(機械学習結果等)で埋める。ランダムな値で埋めるのはバットプラクティス。
  • Multiple imputation by chained equation(MICE)(多重代入法):欠損データに単一代入法を繰り返し、得られた結果を統合。

Box and whisker plot(箱ひげ図)

データの分布を視覚化したもの。外れ値の検出にも使用する。

Data Augmentation(データ拡張)

データが不足している場合に、拡張する手法。画像データの場合、反転させる、すらす、ノイズを加えるといったことを行うことでデータを増やす。

Polynomial

数値データを多項式で変換し、新たな特徴を生成する。

Binning(ビニング)

特徴が分かりにくい連続データを区切って特徴量を明確化。例:人に紐づくデータを、大学生や小学生といった単位で区切る等。

Logarithmic transformation(対数変換)

データの分布が偏っている場合に使うと、疑似的に正規分布に近づける事ができる。

ワンホットエンコーディング

状態を合わすためにデータを0または1に変換する。
例:
月火水木金土日をそれぞれ月=1, 火=2,・・・日=7と数値に変換すると、数値の大きさが学習結果に影響する。そのため、カラムをすべて分けて下記のように表現するのがワンホットエンコーディング

レコード ・・・
レコード1 1 0 ・・・ 0
レコード2 0 1 ・・・ 0
レコードn 0 0 ・・・ 1

Classification(分類)

教師あり。犬か?猫か?などそのデータが示すクラスを予測する。

Binary classification(二項分類)

これは犬?犬ではない?やコインの裏表などの二者択一の分類

Confusion Matrix(混同行列)

Binary classification(二項分類)の評価指標。予測と実際の数を以下の表でまとめたもの。
例:犬と予測し実際に犬だった場合はTP(真陽性),犬ではないと予測し実際に犬だった場合はFN(偽陰性)にカウントする。

↓予測 実際→ True False
Positive True Positive(真陽性) False Positive(偽陽性)
Negative False Negative(偽陰性) True Negative(真陰性)

上述の表を以下の評価指標で評価することで、機械学習モデルの精度を評価する。 例えば、Precisionは高いがRecallは低いという場合、陽性と予測したもののほとんどが陽性だったという点では高い精度を示したとみなせるが、多くの陽性を見逃したという点では精度が低いとみなせる。こういったケースでは真とみなす閾値(クラス確率の閾値)を調整し、より積極的に陽性と判定するように(例えばより積極的に犬と判定するように)モデルをチューニングする。もちろんTP,FP,FN,TNのうちどれを高めたいかはユースケース次第である。

評価指標 概要
Precision(適合率) この値が高いほど、陽性と予測したもののうち、高い割合で実際に陽性だったことを示す。 TP/(TP + FP)
Recall(再現率) この値が高いほど、実際に陽性だったもののうち、高い割合で陽性と予測できた事を示す。 TP/(TP + FN)
Accuracy(正確度 ) この値が高いほど予測通りだったことを示すが、TPとTNのどちらかがより予測通りだったかどうかは評価できない。 (TP + TN)/(TP + FP + FN + TN)
F-measure(F値) モデルの全体的なバランスを評価 (2 × precision × recall)/(precision + recall)
ROC曲線,AUC 真陽性率を縦軸に、偽陽性率を横軸にROC曲線とAUC(面積)で表現したもの。AUCが広いほど精度が高い。 -

Cross entropy error(交差エントロピー誤差)

分類問題で使用される予測と実測値との誤差。

Regression(回帰)

教師あり。株価などの連続値を予測する。

Linear regression(線形回帰)

機械学習の結果が概ね線形の形になった状態。売上予測や販売数予測等で、いくらになるか?何個になるか?といった具体的な数値を予測する。

Logistic regression(ロジスティック回帰)

発生確率を予測。ある事象が発生するか否かを0~1の数字で表現。

残差プロット

回帰の結果と実際のデータとの差(残差)を散布図で表現したもの。散布図で残差0を軸としたばらつきを確認し、ばらつきが均等ではなく何らかの偏りや傾向がある場合、モデルは何らかの改善の余地があると解釈できる。残渣プロットの結果が良好であれば、RMSEなどを用いてモデルの精度を評価する。

Mean Absolute Error(MAE)(平均絶対誤差)

回帰モデルの評価指標。誤差の絶対値。

Mean Squared Error(MSE)(平均二乗誤差)

回帰モデルの評価指標。

Root Mean Squared Error(RMSE)(二乗平均平方根誤差)

回帰モデルの評価指標。MSEの平方根。0に近いほど精度が高い。

トピックモデル

教師なし。文章の中のトピックを分析。政治、経済、スポーツ、音楽、などのトピックを類推する。

Latent Dirichlet Allocation(LDA)(潜在的ディリクレ配分法)

教師なし。単語や文書を低次元ベクトルで表現。文書や単語の分類、類似文書の検索に利用。

Neural Topic Model(NTM)。

教師なし。文書中のトピックを生成する。

ニューラルネットワーク

  • 教師あり、教師なしどちらの学習にも用いられる。
  • ニューラルネットの学習でバッチサイズが大きいと個々のデータの特徴が失われ、局所解にトラップされやすい。その場合バッチサイズを小さくする。
  • ニューラルネットワークは複雑であるため、過学習が発生しやすい。

Perceptron(パーセプトロン)

教師あり。2層のニューラルネットワーク。分類やパターン認識などに利用する。線形分離可能なものにしか使えない。

Multilayer perceptron(MLP)

教師あり。多層のパーセプトロン

Deep Neural Network(DNN)(深層学習)(ディープラーニング)

教師あり/教師なし/強化学習のいずれも対応可能。4層以上のニューラルネットワーク

Recurrent neural network(RNN)(再起型ニューラルネットワーク)

教師あり。数値の時系列データを認識する。

Long Short-Term Memory(LSTM)

教師あり。RNNを拡張したもの。ニューラルネット内で短期記憶を長期間活用できる。
回帰・分類両方の予測に利用可能。言語や文章理解に使用する。感情分析や音声・動画などにも応用可能。 word2vecと組み合わせ、word2vecで単語をベクトル化し、それをインプットにLSTMで学習するといった手法も用いられる。

Convolutional Neural Network(CNN)

教師あり。画像認識に使用する。

InceptionNet

Googleが開発した画像認識CNN。TensorFlowで利用可能。

Activation function(活性化関数)

ニューラルネットワークにおいて出力値を調整するための様々な関数

  • Hyperbolic tangent function(tanh):数値を-1.0~1.0の間に変換。
  • Sigmoid function:数値を0.0~1.0の間に変換。2値分類で使用する。
  • Softmax function:数値を0.0~1.0の間かつ合計で1.0になるように変換。3値以上の分類で使用する。
  • Leaky Rectified Linear Unit(Leaky ReLU):入力値が0以上であればそのまま、0以下であればa倍(aは通常0.01)する関数。
  • Xavierの初期値:活性化関数の出力結果がきれいに分散するように、局所解にトラップされないようにするための初期値(数式)

その他機械学習の用語整理

過学習(オーバーフィット)

  • モデルをトレーニングしすぎること。過学習の結果、モデルがトレーニング用のデータに最適化されてしまい、テストデータや実データに対する精度が落ちる。例えば、トレーニングデータには90%の精度だが、テストデータには70%の精度しか出ないといったことが起きる。
  • 過学習を防ぐ方法として、L1正則化とL2正則化という手法がある。L1正則化はあるデータの重みを0に、L2正則化はあるデータの重みを0に近づけていくことによって特徴量を削減していく。
  • 過学習を防ぐため、ドロップアウトというランダムにデータを0にし、欠損データを作る手法が用いられる。

    アンダーフィットとオーバーフィットに関する補足説明

  • アンダーフィットする場合:データを追加する、正規化を減らす。
  • オーバーフィットする場合:ドロップアウト、正規化を増やす、機能の組み合わせを少なくする。

以下のAmazon Machine Learning Developer Guideの説明が分かりやすい。

f:id:VbuiV:20220317110108p:plain 引用:モデルフィット: アンダーフィットとオーバーフィッティングと - Amazon Machine Learning

ハイパーパラメータ

  • 過学習のバランスや、バッチサイズ等、各種機械学習における様々な調整を行うパラメータ。

Reinforcement Learning(強化学習)

  • 動的にデータを取り込み、繰り返し学習を行う。

Incremental learning(増分学習)

  • 時間経過につれ、モデルの推論精度が低下していく場合に、データセットを拡張して行うトレーニング。

バッチサイズとエポック数

  • バッチサイズ:一回のデータ数、エポック数:繰り返す数。
  • 全部で10,000件のデータがあった場合、バッチサイズ=100、エポック数=100でトレーニングするか?バッチサイズ=200、エポック数=50でトレーニングするか?のようなことを検討する。

ホールドアウト法

  • データを分割する方法。
    シンプルにトレーニング用:テスト用=6:4、トレーニング用:テスト用=8:2などに分割。

K-fold cross-validation(K分割交差検証)

  • 分類と回帰に使用できる評価方法
  • データをKグループに分割し、各グループから1つテストーデータに、残りをトレーニングデータに利用する。
  • 層化K分割交差検証:データが偏っている時に使用するK分割交差検証で、元々のデータの割合を保って分割する。例え100個のデータ中にAのデータが10個、Bの90個だった場合に、K=10で分割するとAのデータが一つも含まれないグループが存在する可能性が高い。そういったケースにおいて、各グループが元々のデータと同じ割合を保つ必要がある場合に使用する。

K-means

  • 教師なし。データをK組にグループ分け(クラスタリング)する手法。散布図のようなイメージで可視化。
  • Kの数の決め方にはエルボー法とシルエット分析がある。
    • エルボー法:K=1,2,3・・・といろいろなパターンで試行した際のSSEの値を折れ線グラフで表現。大きく折れ曲がったところが最適なKと判断できる。
    • シルエット分析:K=1,2,3・・・といろいろなパターンで試行した結果をシルエットとして表現。シルエットの高さがなるべくそろっている時のKが最適と判断できる。
  • PCAやt-SNEで次元削減した結果にK-meansを実行するといった手法も用いられる。
  • t-SNEに比べて高速。

t-SNE

  • 高次元のデータを2~3次元に減らし、散布図のようなイメージで可視化する。

Principal component analysis (PCA)(主成分分析)

  • 教師なし。データが主にどの成分によって成り立っているかを可視化する。散布図のようなイメージで可視化。
  • 計算量を減らすため、データの特徴を保持したまま情報量を削減する(次元削減)。

Random Cut Forest (RCF)

Factorization Machines(FM)(因数分解機)

  • 教師あり。分類や回帰に利用可能。レコメンドの生成に使用する。スパースなデータ(スカスカ)からも学習可能。

Collaborative Filtering(協調フィルタリング)

  • 購入履歴などのユーザの好みを蓄積、分析し、レコメンドを行う。

Linear Learner

  • 教師あり。分類・回帰両方可能。

Gradient (勾配降下法)

  • 関数の最小値を求める。二次関数(Uの字)の頂点を求めるイメージ。パラメータ更新を繰り返しながら、計算する。
  • Gradient checking(勾配確認):式にミスがないか、誤差を確認することによってチェックすること。偏微分を近似して値が正しいかを確認する。
  • バッチ勾配降下法(最急降下法):毎回全てのデータを使用する勾配降下法。計算量が多い。極小値にトラップされやすい。結果は安定する。
  • ミニバッチ勾配降下法:パラメータ更新毎にランダムに抽出した一部のデータを使用する。バッチ勾配降下法と確率的勾配降下法の間の方法。
  • 確率的勾配降下法:パラメータ更新毎にデータを一つランダムに抽出して使用する勾配降下法。計算量は少ない。極小値にトラップされにくい。毎回結果が安定しないことがある。
  • Optimizer:RMSprop,Momentum,Adam,Adagrad等

XGBoost

  • 教師あり。分類・回帰両方可能。非常に強力で人気なアルゴリズム
  • Gradient Boosting Decision Tree(GBDT)(勾配ブースティング決定木)のフレームワーク
  • GBDT:Gradient(勾配降下法)とBoosting(アンサンブル)とDecision Tree(決定木)を組み合わせた手法

k-nearest neighbor algorithm(k-NN)(k近傍法)

  • 教師あり。分類・回帰両方可能でシンプルな手法。

Instance Segmentation(インスタンスセグメンテーション)

  • 教師あり。画像内の物体を分類。

Single Shot Multibox Detector(SSDアルゴリズム)

  • 教師あり。物体検知(車や飛行機等)。

Support Vector Machine (SVM)

  • 教師あり。分類・回帰を行う。

One Class SVM

  • 教師なし。外れ値/異常値検出

SVM-RBF

  • Radial basis function kernelを用いたSVM。精度が高い。

Term frequency–Inverse document frequency(tf-idf)

Term frequency(文書中の単語の出現頻度)とinverse document frequency(単語がどの程度レアか?)を組み合わせた指標。文書内の各単語の重要度を表現することができる。

ポアソン分布

ある事象が一定時間に何回発生したか?例:交差点の事故回数

オーバーサンプリング

  • アンバランスなデータを補正する手法。少数派クラスからデータを複製する。

アンダーサンプリング

  • アンバランスなデータを補正する手法。多数派クラスからデータを削除する。

Synthetic Minority Over-sampling Technique(SMOTE)

  • アンバランスなデータに対するオーバーサンプリングの手法の一つ。

目的変数(ターゲット変数)と説明変数

  • 数式でいうyとxの関係。yが目的変数、説明変数がx。

STL分解

  • 時系列データからトレンドや季節性を把握する手法。

ピアソン相関係数

  • -1.0~0~+1.0の間でデータ同士の相関関係を表現。
    -1.0:逆の相関がある。0:相関がない。+1.0:データ同士に強い相関関係がある。

Bayesian network( ベイジアンネットワーク)

  • グラフ構造と確率でデータを表現。頂点から延びる二つの辺に4:6などの割合があるイメージ。
  • ナイーブペイズ: ベイジアンネットワークの一種で、1つの親データに紐づく複数の子データ同士に相関がなく独立している状態。

機械学習フレームワークやライブラリ

Scikit-learn

Python機械学習用ライブラリ。Sagemakerで利用可能。
scikit-learn.org

Natural Language Toolkit(NLTK)

Python自然言語処理ライブラリ。意味推論や構文解析を行う。
www.nltk.org

TensorFlow

Googleが開発した機械学習ライブラリ。Sagemakerで利用可能。
www.tensorflow.org

Apache MXNet

Sagemakerで利用可能。 mxnet.incubator.apache.org

seaborn

グラフを作成するライブラリ。
seaborn.pydata.org

Horovod

分散型深層学習のフレームワーク
github.com

【AWS】CloudFormation Guardによるテンプレート評価手順

概要

CloudFormationのベストプラクティスの一つである下記に貢献できるツール”AWS CloudFormation Guard(cfn-guard)” を紹介します。

Validate templates before using them

Validate templates for organization policy compliance

引用:AWS CloudFormation best practices - AWS CloudFormation

<記載内容>

GitHubで公開されている3rd Party製CloudFormationテンプレート(以降 CFnテンプレート)の静的チェックツール"cfn-guard"の製品紹介です。インストールして動作させるための手順、評価ルール作成や評価時の具体的なコマンド例を記載しています。さらに、トライアルで利用した際に作成したポリシー例やTips集等、 cfn-guardを初めて使う方に役立つ情報をいくつか紹介します。
(注意)コマンドやルール例は、Markdownの都合上エスケープ処理をしています。そのため、コピー&ペーストでうまく動かない可能性があります。

アジェンダ

  1. AWS CloudFormation Guardとは
  2. Windows10へのインストール方法
  3. 使い方
  4. よく使う評価ルール
  5. 所感
  6. Tips
    • ymlで改行を表現する記法”|(パイプ)”が認識されない
    • 多段階層構造をもつパラメータの評価ルール自動生成時の注意点
    • List形式のパラメータの一部のみの評価ができない

1.AWS CloudFormation Guardとは

github.com

2.Windows10へのインストール方法

  • 公式(GitHub)のインストールガイドに従ってインストール可能。

Windows 10: Install Rust and Cargo

  1. Create a Windows 10 workspace.
  2. Install the version of Microsoft Visual C++ Build Tools 2019 which provides just the Visual C++ build tools: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2019.
  3. Download the installer and run it.
  4. Select the "Individual Components" tab and check "Windows 10 SDK".
  5. Select the "Language Packs" tab and make sure that at least "English" is selected.
  6. Click "Install".
  7. Let it download and reboot if asked.
  8. Install Rust.
  9. Download rust-init.exe.
  10. Run it and accept the defaults.

    Cargo-based Installation

    Now that you have rust and cargo installed, installation of cfn-guard is easy: $ cargo install cfn-guard

引用:https://github.com/aws-cloudformation/cloudformation-guard#installation

(注意)上記の手順4についてですが、Windows 10 SDKだけではRustが正常に動作しませんでした。私の環境では、”個別のコンポーネント”ではなく、”ワークロード>C++によるデスクトップ開発”でインストールしたら問題なく動作するようになりました。

3.使い方 評価ルールの作り方

○ルールセット作成コマンド(コマンドプロンプト
$ cfn-guard rulegen -t [CFnテンプレート名] -o [ルールセット名]
例:cfn-guard rulegen -t test.yml -o test.ruleset
○実行例

読み込ませるCFnテンプレート(test.yml)

AWSTemplateFormatVersion: '2010-09-09'
Description: Sample template
Resources:
  SampleVolume:
    Type: AWS::EC2::Volume
    Properties:
      Encrypted: true
      Size: 10
      VolumeType: gp3

生成されるルールセット
EBSにPropertyとして設定した3つのパラメータを評価するルールが生成される。

let aws_ec2_volume_resources = Resources.*[ Type == 'AWS::EC2::Volume' ]
rule aws_ec2_volume when %aws_ec2_volume_resources !empty {​​
  %aws_ec2_volume_resources.Properties.Encrypted == true
  %aws_ec2_volume_resources.Properties.VolumeType == "gp3"
  %aws_ec2_volume_resources.Properties.Size == 10​​​​​​​​​
}

3.使い方 テンプレートの評価方法

  • 検査対象CFnテンプレートと検査内容が記載されたルールセットを引数にコマンドを実行する。
○評価コマンド(コマンドプロンプト
$ cfn-guard validate -d [CFnテンプレート名] -r [ルールセット名]
例:cfn-guard validate -d test.yml -r test.ruleset
○実行例

実行例1:ルールセットに準拠している場合
test.ymlを先ほど生成したルールで評価した例

test.yml Status = [32mPASS[0m[1mPASS rules[0m
test.ruleset/aws_ec2_volume    [32mPASS[0m
---
Evaluation of rules test.ruleset against data test.yml
--
Rule [test.ruleset/aws_ec2_volume] is compliant for template [test.yml]
-

実行例2:ルールセットに準拠していない場合
test.ymlを以下の通り変更してから評価した例

  • Encrypted: true → false
  • Size: 10 → 15
  • VolumeType: gp3 → gp2
test.yml Status = [1;31mFAIL[0m[1mFAILED rules[0m
test.ruleset/aws_ec2_volume    [1;31mFAIL[0m
---
Evaluation of rules test.ruleset against data test.yml
--
Property [/Resources/SampleVolume/Properties/Encrypted] in data [test.yml] is not compliant with [test.ruleset/aws_ec2_volume] because provided value [false] did not match expected value [true]. Error Message []
Property [/Resources/SampleVolume/Properties/VolumeType] in data [test.yml] is not compliant with [test.ruleset/aws_ec2_volume] because provided value ["gp2"] did not match expected value ["gp3"]. Error Message []
Property [/Resources/SampleVolume/Properties/Size] in data [test.yml] is not compliant with [test.ruleset/aws_ec2_volume] because provided value [15] did not match expected value [10]. Error Message []
--

4.よく使う評価ルール

作成したルールを何個か紹介します。
(補足)全てのルールを一つのルールセットファイルに記入しても問題なく動作します。各ルールの一行目(letから始まる行)で検査対象のルールセットを指定しているため、条件に合致しないルールはスキップされます。

  • KMSのキーローテーションが有効か
let aws_kms_key_resources = Resources.*[ Type == 'AWS::KMS::Key' ]
rule aws_kms_key when %aws_kms_key_resources !empty {
  %aws_kms_key_resources.Properties.EnableKeyRotation == true
}
let aws_kms_alias_resources = Resources.*[ Type == 'AWS::KMS::Alias' ]
rule aws_kms_alias when %aws_kms_alias_resources !empty {
  %aws_kms_alias_resources.Properties.AliasName == /alias\/(sample)-(.*)-(.*)/
}
  • Nameタグが付いているか
let aws_backup_backupvault_resources = Resources.*[ Type == 'AWS::Backup::BackupVault’ ]
rule aws_backup_backupvault when %aws_backup_backupvault_resources !empty{
  %aws_backup_backupvault_resources.Properties.BackupVaultTags == {"Name":/.*/}
}
  • S3がパブリック非公開か,暗号化しているか,ログを出力する設定になっているか
let aws_s3_bucket_resources = Resources.*[ Type == 'AWS::S3::Bucket' ]
rule aws_s3_bucket when %aws_s3_bucket_resources !empty {
  %aws_s3_bucket_resources.Properties.PublicAccessBlockConfiguration == {"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true}
  %aws_s3_bucket_resources.Properties.BucketEncryption.ServerSideEncryptionConfiguration !empty
  %aws_s3_bucket_resources.Properties.LoggingConfiguration !empty
}
  • LBがHTTPSだけListenしているか,最新のSSLポリシーを使用しているか
let aws_elasticloadbalancingv2_listener_resources = Resources.*[ Type == 'AWS::ElasticLoadBalancingV2::Listener' ]
rule aws_elasticloadbalancingv2_listener when %aws_elasticloadbalancingv2_listener_resources !empty {
  %aws_elasticloadbalancingv2_listener_resources.Properties.Protocol == "HTTPS"
  %aws_elasticloadbalancingv2_listener_resources.Properties.SslPolicy == "ELBSecurityPolicy-2016-08“
  %aws_elasticloadbalancingv2_listener_resources.Properties.Port == 443
}

5.所感

  • 主に規約違反やセキュリティ上好ましくない設定の検出に使用可能。
  • 他のセキュリティ系サービスと比較すると、実環境にデプロイする前にCFnテンプレートの段階でポリシー違反を検出できる点がCloudFormation Guardの特徴。
    • Config/Security Hub :デプロイ後のAWSリソースのパラメータを評価
    • Trusted Advisor :AWSリソースの稼働状況を評価
    • Guard Duty:不正なアクティビティを検知
  • プロジェクトや組織としてのポリシーが明確で、繰り返しCloudFormationを実行するような運用を行う場合は有用。
  • CFnテンプレートの記載の仕方によってはうまく評価できない。(Tipsを参照)

6.Tips

ymlで改行を表現する記法”|(パイプ)”が認識されない

ymlで改行を認識するための記法“|(パイプ)”が正しく認識されず、テンプレート上に下記例の様なコードが存在していると、rulegenの際にエラーとなる。

        Type: "AWS::KMS::Key"
        Properties:
            KeyPolicy:  !Sub |     ←この記法が認識されず、rulegenでエラーになる。
                {​​​​​​​
                  "Id" : "key-default-1",
                  "Version" : "2012-10-17",

⇒対処方法

  • 上述の例の構造を正しく評価する方法は見つけられなかった。
  • 一旦当該箇所をコメントアウトした上でrulegenを行えば、評価ルールの作成は可能。
  • validateの際は、テンプレート上存在していても(コメントアウトしていないくても)、問題なく評価可能

多段階層構造をもつパラメータの評価ルール自動生成時の注意点

階層構造のパラメータの例(BackupPlan)

List形式のパラメータの一部のみの評価ができない

リスト形式のパラメータの例(BackupPlanRule)

文字列の値については正規表現の評価が可能なため、"何かしらの値が存在すればよい"という様に実質的に無視することは可能。ただし、数値は正規表現で評価できなかった。