はじめに
SRE1課の石井です。
現在多数のEC2(主にLinux)が稼働しているプロジェクトに参加しています。 プロジェクトで発生する業務を何かしらの仕組みで自動化して工数を減らしたいと考えてます。 メンテ面を考えると凝った作りのshellscriptやpythonで自動化スクリプトは組みたくありません。
そのためjenkinsのようなジョブを組み合わせてグラフィカルにジョブ操作できる仕組みで実装したいと思って調査をしました。 結果、Step Functionsというサービスを使えば実現できそうな印象を受けました。
今回、複数回に分け、以下の構成でStep Functionsの検証技術記事を記載します。
- part1_環境準備
- part2_コード編集
- part3_自動化シナリオ実践
各章は下記の内容を記載します。
- part1:環境準備の方法
- part2:Step FunctionsやSAMテンプレートの内容
- part3:私が業務でStep Functionsを用いて自動化したシナリオ
本記事では環境準備にフォーカスした内容となります。 最終的にCloud9上でsam initで取得したStateMachineのサンプルをAWS上にデプロイする所まで行います。
対象者
- Cloud9やSAMを使ったことがない方
- SAMの概要を知りたい方
- StateMachineのサンプルをデプロイしたい方
前提と環境準備の内容
それではマネジメントコンソールから自動化の仕組みを作るため、「Step Functions」で検索して・・・と書きたい所ですが、今回作る仕組みはgitでコード管理する前提で作業します。 そのため、WebIDEのマネージドのサービス「Cloud9」からSAMを使い、CLIベースで編集からデプロイまで行います。 SAMは本記事の後半で概要や使い方を記載しますが 下記の要素は次回の投稿で概要と使い方を記載します。
- StateMachine,ASLファイル
- SAMテンプレート
Cloud9について
まずはCloud9について軽く触れておきます。
Cloud9概要:
Cloud9はAWSが提供するWebIDEのサービスです。
LinuxがインストールされたEC2インスタンスを自動で作成、動作させて サインインしているAWS IAMアカウントの権限で動作します。
メリット:
- 自動作成されたEC2はDockerやPythonなどがインストールされている
- ブラウザからもEC2のターミナルを制御でき、任意のコマンドを実行可能
- 各々の開発者が使うエディタを統一できる
下記の図が動作イメージとなります。 ※Cloud9の構築と利用に関する権限は以下となります。 環境構築:AWSCloud9Administratorポリシー 環境利用:AWSCloud9ポリシー
参考:AWS Cloud9 での Identity and Access Management
Cloud9の環境準備
概要をある程度掴んだところで、早速手を動かしましょう。 マネジメントコンソールからCloud9を検索してください。
(手持ちのエディタから自身のAWS環境へ接続する方、またはローカルで開発する方は本項目を読み飛ばしてください。)
①「Create enviromnment」をクリックします。
②ここも特に迷うこともないはず。下記項目を入力して「Next step」をクリックします。
Name: Cloud9上の表示名
Description: 説明
③色々入力する要素が出ました。ですがここも深くは考えず各種パラメータはデフォルトで入力のまま「Next step」をクリックします。
各種パラメータについて:
Environment type
EC2環境の種類を選択します。
Create a new EC2 instance for environment (direct access) コード編集するEC2の環境を新規で作ります。Cloud9からEC2へSSH接続して作業する一番シンプルな方式。
Create a new no-ingress EC2 instance for environment (access via Systems Manager) Cloud9からEC2へのアクセスをSSM経由してアクセスします。
Create and run in remote server (SSH connection) CLoud9がすでに構築済みのEC2サーバにSSHで接続します。常時起動し続けてるEC2があればこちらの方が料金的にお得だと思います。
Instance type 作成するインスタンスタイプです。最も安価な「t2.micro」を選択しています。
Platform 特にこだわりはないので、推奨されている「AmazonLinux2」を選択しています。
Cost-saving settings 自動的に停止状態にするための設定です。デフォルトの「After 30 minutes」を選択しています。 操作しない状態が30分続くとEC2が停止し、料金を抑えることができます。
IAM role Cloud9実行時に必要なサービスリンクロールを作成します。 EC2の作成、削除、一時停止やAWSリソースの操作など、必要な権限が付与されています。 規定のまま設定しておけば適切に作成されるので、このままにします。
Network settings (advanced) 作成するEC2をどのVPCに接続するか、という選択肢です。 Cloud9から生成したEC2にアクセスにはインターネット経由となります。*1 インターネットから到達可能なVPCのサブネットは初期状態であればデフォルトVPCが対応しています。
追記:記事書いた後にプライベートの環境でCloud9が出来ないか調査したのですが、既に技術1課の加藤さんが投稿済みでした。 AWS Cloud9をプライベート環境で利用できるようになりました
④設定確認画面が出ます。そのまま「Create environment」をクリックします。
⑤作成中の画面に遷移後、下記のVisual Studio Codeのような画面が出たら構築完了です。 Cloud9のEC2はシャットダウンの概念はなく、操作がなければ勝手に終了します。(デフォルトは30分) 力尽きたらブラウザのバツボタンをクリックして終了できるのが手軽でいいですね。
⑥Cloud9用のEC2ができた所で、SAM CLIのバージョンが古いためアップグレードをします。 公式のSAMインストール手順を参考に下記コマンドを実行します。
$ wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip $ unzip aws-sam-cli-linux-x86_64.zip -d sam-installation $ sudo ./sam-installation/install --update
SAMについて
Cloud9のEC2はなんと最初からgitコマンド、dockerコマンドやsam-cliが使えます。 そのためすぐにでもsam initを実行したい所ですが、SAMについて軽く触れておきます。 公式の概要の説明は下記です。
AWS サーバーレスアプリケーションモデル (SAM、Serverless Application Model) は、サーバーレスアプリケーション構築用のオープンソースフレームワークです。迅速に記述可能な構文で関数、API、データベース、イベントソースマッピングを表現できます。リソースごとにわずか数行で、任意のアプリケーションを定義して YAML を使用してモデリングできます。デプロイ中、SAM が SAM 構文を AWS CloudFormation 構文に変換および拡張することで、サーバーレスアプリケーションの構築を高速化することができます。
Serverless Application Modelの略という事と、これを使えば構築が楽になりそう・・・という感じが読めますが、一言で言えばCloudFormationを拡張したサーバレスアプリケーションの開発環境です。 SAMの実体は「AWS SAM CLI」と呼ばれるコマンドラインツールです。 AWS SAM CLIのコマンドで「AWS SAM テンプレート」の記載内容に従い、作成予定のリソースを自動でAWS環境上に作成します。
AWS SAM テンプレート
AWS SAM テンプレート(以下SAMテンプレート)ではデプロイ予定リソースの各種設定を記述します。 この各種設定とは、「作成するLambda関数の名前、イベントソースの設定、VPCの結び付、Lambdaランタイムのメモリ量、タイムアウト時間」などです。
これらの要素をSAMテンプレートに記載しておきSAMコマンドの「sam build」「sam deploy」コマンドを実行するとCloudFormationへ自動でデータを流し、CloudFormationでリソースのデプロイを行います。
図で表すと上記のようなイメージとなります。 LambdaやStep Functionsの量が多くなれば、GUIベースでのデプロイが億劫になりますが、SAMだと一発で終わるため楽ですね。
まとめると下記となります。
SAM要約:
- Serverless Application Modelの略
- CloudFormationを拡張したサーバレスアプリケーションの開発環境
- SAMテンプレートに実装予定のリソースを記載、記載内容を元にSAMがCloudFormationでデプロイ
メリット:
- 大量にLambdaを作成や変更をデプロイしたいとき、SAMテンプレートとLambdaを編集すればデプロイ作業はSAMが肩代わりしてくれる
- CloudFormationでのデプロイになり、手動デプロイによる作業ミスが発生しない
- 手動デプロイの作業工数が減る
プロジェクト開始
SAMが便利だとなんとなく理解したところで、Step Functions開発を始めましょう。 ※ここからはSAMコマンドベースにSAMの挙動を確認していきます。 SAMは開発の雛形となるデータを「Serverless Application Repository」というリポジトリからsam initコマンドにより取得できます。 ※マネジメントコンソールからLambdaを作成する時、「設計図の使用」ボタン押すと出てくるサンプルはこのリポジトリを参照しています。 作業の流れイメージ
sam init
それでは、Cloud9のターミナルでsam initを実行して作業を行いましょう。 ※Cloud9のターミナルが表示されていない場合はALT + Tで表示させてください。
①テンプレートの選択。1を選択して AWSのテンプレートから作成します。
administrator:~/environment $ sam init You can preselect a particular runtime or package type when using the `sam init` experience. Call `sam init --help` to learn more. Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1
②アプリケーションテンプレートの選択。2を選択してStep Functionsの雛形を取得します。
Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API 4 - Scheduled task 5 - Standalone function 6 - Data processing 7 - Infrastructure event management 8 - Machine Learning Template: 2
③ランタイムの選択。10を選択してpython3.9で行います。
Which runtime would you like to use? 1 - dotnet6 2 - dotnetcore3.1 3 - go1.x 4 - java11 5 - java8.al2 6 - java8 7 - nodejs16.x 8 - nodejs14.x 9 - nodejs12.x 10 - python3.9 11 - python3.8 12 - python3.7 13 - python3.6 14 - ruby2.7 Runtime: 10 Based on your selections, the only Package type available is Zip. We will proceed to selecting the Package type as Zip. Based on your selections, the only dependency manager available is pip. We will proceed copying the template using pip.
④X-Rayトレーシングを有効にするか聞かれています。Nを選択します。 ※そもそもX-Rayトレーシングを使ったことないので、どこかで検証試してみたい..
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
⑤最後にプロジェクト名を入力して完了です。
Project name [sam-app]: sample-sam Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ----------------------- Generating application: ----------------------- Name: sample-sam Runtime: python3.9 Architectures: x86_64 Dependency Manager: pip Application Template: step-functions-sample-app Output Directory: . Next steps can be found in the README file at ./sample-sam/README.md Commands you can use next ========================= [*] Create pipeline: cd sample-sam && sam pipeline init --bootstrap [*] Validate SAM template: sam validate [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch administrator:~/environment $
これでサンプルとなる雛形はダウンロードできました。
sam build
ここから自動化を実現したい内容を編集していくのですが、一旦このまま取得したサンプルをビルド&デプロイしてAWS上で動かしてみたいと思います。
ビルドには「sam build -u」コマンドを使います。 -uのオプションは「--use-container」の短縮系です。 このオプションを指定することで、作業中のマシンにランタイムがなくてもpython3.9のランタイムを持ったコンテナが起動してビルドされます。 逆に-uがなければ実行中のマシンにpython3.9が入っていないとビルドできません。 コンテナが動かせない環境、といった条件でなければ基本的に-uをつけてビルドした方が良さそうです。
ではCloud9のプロジェクトのディレクトリに移動してビルドしてみましょう。
administrator:~/environment $ cd sample-sam/ administrator:~/environment/sample-sam $ sam build -u Starting Build inside a container 〜中略〜 RuntimeError: Container does not exist. Cannot get logs for this container [32187] Failed to execute script __main__
サンプルをビルドしたいだけなのに・・・/(^o^)\ エラーメッセージで調べるとCloud9の容量不足のようです。 公式のページから容量の増やし方を見るとスクリプトをコピペして実行するだけなので、早速65Gまで増やして再度実行してみました。
administrator:~/environment/sample-sam $ sam build -u Starting Build inside a container 〜中略〜 Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch [*] Deploy: sam deploy --guided Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource administrator:~/environment/sample-sam $
無事ビルドできました。 ビルドした内容は.aws-samというディレクトリに配置されます。 ※Cloud9の場合隠しディレクトリはデフォルトだと表示されますが、ビルドした内容が気になる方は、歯車ボタンから表示させてみましょう。
sam deploy
初回はデプロイ先がSAMに設定されていないため、「--guided」オプションを付与して対話形式でデプロイ先の設定を行いましょう。
また、以降のデプロイでIAMに対して変更を行うデプロイを行うと「"FAILED" Status: FAILED. Reason: Requires capabilities : [CAPABILITY_***]」というエラーが発生します。 公式ページを見ると「IAMリソースの作成を明示的に許可する」というオプションを付与する必要があるようです。そのため「--capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND」というオプションを最初から付与しておきます。
それでは早速デプロイしてみます。
※対話モードでの質問はsam deployコマンドに説明があります。各種オプションを組み合わせればguidedオプションがなくても、一発で通るコマンドを作ることもできると思います。
①スタック名を聞かれています。CloudStackに登録される名称のため、任意で構いません。
administrator:~/environment/sample-sam $ sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND Configuring SAM deploy ====================== Looking for config file [samconfig.toml] : Not found Setting default arguments for 'sam deploy' ========================================= Stack Name [sam-app]: sample-sam-stack
②リージョン先です。東京リージョンなのでそのままEnterを押しています。
AWS Region [ap-northeast-1]: #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
③すでにデプロイされたものを変更しても良いか、という質問です。yを入力します。
Confirm changes before deploy [y/N]: y #SAM needs permission to be able to create roles to connect to the resources in your template
④SAMによってIAMロールが作られても良いか、という質問です。yを入力していますが スタックを消した際、ここで作成したIAMロールも一緒に消えてしまいます。 すでに作成済みのIAMロールでデプロイを行う場合はN を入力してください。
Allow SAM CLI IAM role creation [Y/n]: y #Preserves the state of previously provisioned resources when an operation fails
⑤デプロイ中にエラーが発生した場合、CloudFormation スタックをロールバックするかどうかを聞かれています。yを入力します。
Disable rollback [y/N]: y
⑥これまでの設定内容の保存を行うかを聞かれています。yを入力します。 さらにその保存先や環境も聞かれています。 保存先はデフォルトだとプロジェクトの直下に「samconfig.toml」の名前で保存されます。 そのままで良いのでEnterを押します。
Save arguments to configuration file [Y/n]: y SAM configuration file [samconfig.toml]: SAM configuration environment [default]: Looking for resources needed for deployment: Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-e1z84vowoqt4 A different default S3 bucket can be set in samconfig.toml Saved arguments to config file Running 'sam deploy' for future deployments will use the parameters saved above. The above parameters can be changed by modifying samconfig.toml Learn more about samconfig.toml syntax at https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html Uploading to sample-sam-stack/45bd9a8dff25082b8f6d078abb1b3581 2839 / 2839 (100.00%) Uploading to sample-sam-stack/aad5d642e567643ee3234b1638caa40d 671 / 671 (100.00%) Uploading to sample-sam-stack/e7a567f676ae4056e7adbd4e84881e50 913 / 913 (100.00%) Uploading to sample-sam-stack/992cd4f12a9f3b4c5c38e305bb4d821d 912 / 912 (100.00%)
⑦変更セットの作成が始まります。※変更セットとはCloudFormationでアップデートを実行する前にどのような変更が加えられるかを確認する機能です。
Deploying with following values =============================== Stack name : sample-sam-stack Region : ap-northeast-1 Confirm changeset : True Disable rollback : True Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-e1z84vowoqt4 Capabilities : ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : {} Initiating deployment ===================== Uploading to sample-sam-stack/09ec4053824e35a4ea2bfc23c0f57aaf.template 3240 / 3240 (100.00%) Waiting for changeset to be created.. CloudFormation stack changeset --------------------------------------------------------------------------------------------------------------------- Operation LogicalResourceId ResourceType Replacement --------------------------------------------------------------------------------------------------------------------- + Add StockBuyerFunctionRole AWS::IAM::Role N/A + Add StockBuyerFunction AWS::Lambda::Function N/A + Add StockCheckerFunctionRole AWS::IAM::Role N/A + Add StockCheckerFunction AWS::Lambda::Function N/A + Add StockSellerFunctionRole AWS::IAM::Role N/A + Add StockSellerFunction AWS::Lambda::Function N/A + Add StockTradingStateMachineHou AWS::IAM::Role N/A rlyTradingScheduleRole + Add StockTradingStateMachineHou AWS::Events::Rule N/A rlyTradingSchedule + Add StockTradingStateMachineRol AWS::IAM::Role N/A e + Add StockTradingStateMachine AWS::StepFunctions::StateMa N/A chine + Add TransactionTable AWS::DynamoDB::Table N/A --------------------------------------------------------------------------------------------------------------------- Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:968841012693:changeSet/samcli-deploy1656134565/f781ba5a-9058-4c98-b41f-8cef77c113dd Previewing CloudFormation changeset before deployment ======================================================
②この変更セットでデプロイしても良いか、という質問です。yを入力します。
Deploy this changeset? [y/N]: y 2022-06-25 05:23:02 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::IAM::Role StockSellerFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role StockBuyerFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role StockCheckerFunctionRole - CREATE_IN_PROGRESS AWS::DynamoDB::Table TransactionTable - CREATE_IN_PROGRESS AWS::DynamoDB::Table TransactionTable Resource creation Initiated CREATE_IN_PROGRESS AWS::IAM::Role StockSellerFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::IAM::Role StockBuyerFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::IAM::Role StockCheckerFunctionRole Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role StockSellerFunctionRole - CREATE_COMPLETE AWS::IAM::Role StockBuyerFunctionRole - CREATE_COMPLETE AWS::IAM::Role StockCheckerFunctionRole - CREATE_IN_PROGRESS AWS::Lambda::Function StockSellerFunction - CREATE_IN_PROGRESS AWS::Lambda::Function StockBuyerFunction - CREATE_IN_PROGRESS AWS::Lambda::Function StockCheckerFunction - CREATE_COMPLETE AWS::DynamoDB::Table TransactionTable - CREATE_IN_PROGRESS AWS::Lambda::Function StockBuyerFunction Resource creation Initiated CREATE_IN_PROGRESS AWS::Lambda::Function StockCheckerFunction Resource creation Initiated CREATE_IN_PROGRESS AWS::Lambda::Function StockSellerFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function StockSellerFunction - CREATE_COMPLETE AWS::Lambda::Function StockCheckerFunction - CREATE_COMPLETE AWS::Lambda::Function StockBuyerFunction - CREATE_IN_PROGRESS AWS::IAM::Role StockTradingStateMachineRol - e CREATE_IN_PROGRESS AWS::IAM::Role StockTradingStateMachineRol Resource creation Initiated e CREATE_COMPLETE AWS::IAM::Role StockTradingStateMachineRol - e CREATE_IN_PROGRESS AWS::StepFunctions::StateMa StockTradingStateMachine - chine CREATE_IN_PROGRESS AWS::StepFunctions::StateMa StockTradingStateMachine Resource creation Initiated chine CREATE_COMPLETE AWS::StepFunctions::StateMa StockTradingStateMachine - chine CREATE_IN_PROGRESS AWS::IAM::Role StockTradingStateMachineHou - rlyTradingScheduleRole CREATE_IN_PROGRESS AWS::IAM::Role StockTradingStateMachineHou Resource creation Initiated rlyTradingScheduleRole CREATE_COMPLETE AWS::IAM::Role StockTradingStateMachineHou - rlyTradingScheduleRole CREATE_IN_PROGRESS AWS::Events::Rule StockTradingStateMachineHou - rlyTradingSchedule CREATE_IN_PROGRESS AWS::Events::Rule StockTradingStateMachineHou Resource creation Initiated rlyTradingSchedule CREATE_COMPLETE AWS::Events::Rule StockTradingStateMachineHou - rlyTradingSchedule CREATE_COMPLETE AWS::CloudFormation::Stack sample-sam-stack - --------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ------------------------------------------------------------------------------------------------------------------------ Outputs ------------------------------------------------------------------------------------------------------------------------ Key StockTradingStateMachineArn Description Stock Trading State machine ARN Value arn:aws:states:ap-northeast-1:968841012693:stateMachine:StockTradingStateMachine-TkwwKZY4KKnB Key StockTradingStateMachineRoleArn Description IAM Role created for Stock Trading State machine based on the specified SAM Policy Templates Value arn:aws:iam::968841012693:role/sample-sam-stack-StockTradingStateMachineRole-1W2K914UIZAYE ------------------------------------------------------------------------------------------------------------------------ Successfully created/updated stack - sample-sam-stack in ap-northeast-1 administrator:~/environment/sample-sam $
無事デプロイできたようです。早速CloudFormationでスタックができている確認してみましょう。
ちゃんとsam deployでAWSにデプロイできているようです。
では肝心のStep FunctionsとLambdaはというと・・・ Step FunctionsはStockTradingStateMachine-*** という名前でデプロイされており、 Lambdaはsample-sam-stack-Stock***の名前でデプロイされていることが確認できました。 これでサンプル自体はデプロイできていることが確認できたので、Step Functionsを動かしてみます。
StateMachineの実行
しばしばStateMachineという言葉が出てきましたが、Step Functionsで実装したワークフローは「StateMachine」という単位で管理されます。※ジョブに相当するものと解釈して問題ありません。 それではマネジメントコンソールから先程デプロイしたStep Functionsを開き、「実行の開始」をクリックします。 実行の開始画面でjson形式の入力を求められますが、動かすサンプルは入力を必須とする作りではないので、そのままで問題ありません。 ※実際の作成物には、実行時のjsonにインスタンスIDなどを入力させる運用に出来そうです。 動作させると、サンプルの細かい挙動はともかく、StateMachineが動作しました。
これでこのサンプルをベースにどんどん開発できそうです。 今回は環境構築で完了し、次の投稿で具体的にサンプルの内容を読み解き、StateMachineの作り込みとLambdaの作成したいと思います。
参考文献
- AWS サーバーレスアプリケーションモデル
- Linux への AWS SAM CLI のインストール
- 環境の移動と Amazon EBS ボリュームのサイズ変更または暗号化
- SAMのチュートリアル
- Cloud9のチュートリアル
- AWS Lambda実践ガイド 第2版
*1:プライベート環境での作成は追記の項目を参照してください