CloudFormationでSageMakerのライフサイクル設定とノートブックインスタンスの作成をしてみる

2022.12.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。大阪オフィスの林です。

SageMakerのノートブックインスタンスを作成する際に、OSレベルで設定しておきたい内容をSageMakerのライフサイクル設定でスクリプトとして仕込むことが出来ます。
今回はCloudFomationでライフサイクル設定の作成と、作成したライフサイクル設定をアタッチしたSageMakerのノートブックインスタンスを作成する機会がありましたので、内容をまとめておきたいと思います。

やってみた

まずはライフサイクル設定を作成しておきます。
CloudFomationのダッシュボードに移動しスタックを作成します。

テンプレートを指定します。

今回は下記のYAMLファイルを予め作成しています。
内容なサンプルなのでタイムゾーンを変更しているだけです。要件に応じてカスタマイズ頂ければと思います。

Description: "Basic NotebookInstance test"
Resources:
  BasicNotebookInstanceLifecycleConfig:
    Type: "AWS::SageMaker::NotebookInstanceLifecycleConfig"
    Properties:
      NotebookInstanceLifecycleConfigName: NotebookInstanceLifecycleConfig
      OnStart:
        - Content:
            Fn::Base64: !Sub |
              echo "Before timezone..."
              timedatectl
              new_time_zone=Asia/Tokyo
              sudo timedatectl set-timezone $new_time_zone
              echo "After timezone..."
              timedatectl
Outputs:
  BasicNotebookInstanceLifecycleConfigName:
    Value: !GetAtt BasicNotebookInstanceLifecycleConfig.NotebookInstanceLifecycleConfigName
    Export:
      Name: BasicNotebookInstanceLifecycleConfigName

任意のスタック名を指定し次に進めます。

詳細オプションもデフォルトのまま次に進めます。

送信を選択します。

スタックが正常に完了したことを確認します。

次にSageMakerのノートブックインスタンスを作成していきます。
CloudFormationの手順はライフサイクル設定の手順を同様なので省略しますが、SageMakerのノートブックインスタンスを作成には下記のコードを使用しています。

Description: "Basic NotebookInstance test"

Resources:
  BasicNotebookInstance:
    Type: "AWS::SageMaker::NotebookInstance"
    Properties:
      InstanceType: "ml.t2.medium"
      RoleArn: !GetAtt ExecutionRole.Arn
      LifecycleConfigName: { "Fn::ImportValue": BasicNotebookInstanceLifecycleConfigName }
  ExecutionRole: 
    Type: "AWS::IAM::Role"
    Properties: 
      AssumeRolePolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - 
            Effect: "Allow"
            Principal: 
              Service: 
                - "sagemaker.amazonaws.com"
            Action: 
              - "sts:AssumeRole"
      Path: "/"
      Policies: 
        - 
          PolicyName: "sagemaker-test-policy"
          PolicyDocument: 
            Version: "2012-10-17"
            Statement: 
              - 
                Effect: "Allow"
                Action: "*"
                Resource: "*"
Outputs:
  BasicNotebookInstanceId:
    Value: !Ref BasicNotebookInstance

ノートブックインスタンス作成のスタックも正常に完了したことを確認します。

ノートブックインスタンスのターミナルに接続してタイムゾーンを確認すると期待通りJSTに変わってました。

ログを確認してみるとちゃんとUTCからAsia/Tokyoに変わってることが分かります。

まとめ

今回はCloudFomationを使って、SageMakerのノートブックインスタンスの作成とノートブックインスタンス初期設定用のライフサイクル設定を作成してみました。
OSレベルで設定が必要なケースの参考になりましたら幸いです。

以上、大阪オフィスの林がお送りしました!