

サポート終了通知: 2025 年 12 月 15 日に、 AWS はサポートを終了します AWS IoT Analytics。2025 年 12 月 15 日以降、 AWS IoT Analytics コンソールまたは AWS IoT Analytics リソースにアクセスできなくなります。詳細については、[AWS IoT Analytics 「サポート終了](https://docs.aws.amazon.com/iotanalytics/latest/userguide/iotanalytics-end-of-support.html)」を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 分析用カスタムコンテナの使用
<a name="automate-custom-container"></a>

このセクションでは、Jupyter ノートブックを使用して独自の Docker コンテナを構築する方法について説明します。サードパーティー製のノートブックを再利用するとセキュリティ上のリスクがあります。含まれるコンテナはユーザーの許可を得て任意のコードを実行できます。さらに、ノートブックによって生成された HTML を AWS IoT Analytics コンソールに表示することができ、HTML を表示するコンピュータに潜在的な攻撃ベクトルを提供します。使用する前に、サードパーティー製のノートブックの著者を信頼できることを確認します。

独自のカスタムコンテナを作成し、 AWS IoT Analytics サービスで実行できます。これを行うには、Docker イメージをセットアップし、Amazon ECR にアップロードしてから、コンテナアクションを実行するデータセットを設定します。このセクションでは、オクターブ を使用したプロセスの例を示します。

このチュートリアルでは、以下を前提としています。
+ オクターブ がローカルコンピュータにインストールされていること
+ ローカルコンピュータでセットアップされた Docker アカウント
+ Amazon ECR または AWS IoT Analytics アクセスを持つ AWS アカウント

**ステップ 1: Docker イメージをセットアップする**

このチュートリアルには 3 つの主なファイルが必要となります。この名前と内容は以下のとおりです。
+ `Dockerfile` – Docker のコンテナ化プロセスの初期セットアップ。

  ```
  FROM ubuntu:16.04
  
  # Get required set of software
  RUN apt-get update
  RUN apt-get install -y software-properties-common
  RUN apt-get install -y octave
  RUN apt-get install -y python3-pip
  
  # Get boto3 for S3 and other libraries
  RUN pip3 install --upgrade pip
  RUN pip3 install boto3
  RUN pip3 install urllib3
  
  # Move scripts over
  ADD moment moment
  ADD run-octave.py run-octave.py
  
  # Start python script
  ENTRYPOINT ["python3", "run-octave.py"]
  ```
+ `run-octave.py` – から JSON を解析し AWS IoT Analytics、Octave スクリプトを実行し、アーティファクトを Amazon S3 にアップロードします。

  ```
  import boto3
  import json
  import os
  import sys
  from urllib.parse import urlparse
  
  # Parse the JSON from IoT Analytics
  with open('/opt/ml/input/data/iotanalytics/params') as params_file:
      params = json.load(params_file)
  
  variables = params['Variables']
  
  order = variables['order']
  input_s3_bucket = variables['inputDataS3BucketName']
  input_s3_key = variables['inputDataS3Key']
  output_s3_uri = variables['octaveResultS3URI']
  
  local_input_filename = "input.txt"
  local_output_filename = "output.mat"
  
  # Pull input data from S3...
  s3 = boto3.resource('s3')
  s3.Bucket(input_s3_bucket).download_file(input_s3_key, local_input_filename)
  
  # Run Octave Script
  os.system("octave moment {} {} {}".format(local_input_filename, local_output_filename, order))
  
  # # Upload the artifacts to S3
  output_s3_url = urlparse(output_s3_uri)
  output_s3_bucket = output_s3_url.netloc
  output_s3_key = output_s3_url.path[1:]
  
  s3.Object(output_s3_bucket, output_s3_key).put(Body=open(local_output_filename, 'rb'), ACL='bucket-owner-full-control')
  ```
+ `moment` – 入力ファイルまたは出力ファイルと指定した順序に基づいてタイミングを計算するシンプルな オクターブ スクリプト。

  ```
  #!/usr/bin/octave -qf
  
  arg_list = argv ();
  input_filename = arg_list{1};
  output_filename = arg_list{2};
  order = str2num(arg_list{3});
  
  [D,delimiterOut]=importdata(input_filename)
  M = moment(D, order)
  
  save(output_filename,'M')
  ```

1. 各ファイルの内容をダウンロードします。新規のディレクトリを作成し、その中にすべてのファイルを配置して、`cd` をそのディレクトリに移動させます。

1. 以下のコマンドを実行してください。

   ```
   docker build -t octave-moment .
   ```

1. Docker リポジトリに新しいイメージが表示されます。次のコマンドを使用してインストールします。

   ```
   docker image ls | grep octave-moment
   ```

**ステップ 2: Docker イメージを Amazon ECR リポジトリにアップロードする**

1. Amazon ECR でリポジトリを作成します。

   ```
   aws ecr create-repository --repository-name octave-moment
   ```

1. Docker 環境へのログインを取得します。

   ```
   aws ecr get-login
   ```

1. 出力をコピーして実行します。出力は次のようになります。

   ```
   docker login -u AWS -p {{password}} -e none https://{{your-aws-account-id}}.dkr.ecr..amazonaws.com
   ```

1. Amazon ECR リポジトリタグを使用して、作成したイメージをタグ付けします。

   ```
   docker tag {{your-image-id}}  {{your-aws-account-id}}.dkr.ecr.{{region}}.amazonaws.com/octave-moment
   ```

1. Amazon ECR にイメージをプッシュします。

   ```
   docker push {{your-aws-account-id}}.dkr.ecr.{{region}}.amazonaws.com/octave-moment
   ```

**ステップ 3: サンプルデータを Amazon S3 バケットにアップロードする**

1. ファイル 「`input.txt`」 に以下をダウンロードします。

   ```
   0.857549  -0.987565  -0.467288  -0.252233  -2.298007
    0.030077  -1.243324  -0.692745   0.563276   0.772901
   -0.508862  -0.404303  -1.363477  -1.812281  -0.296744
   -0.203897   0.746533   0.048276   0.075284   0.125395
    0.829358   1.246402  -1.310275  -2.737117   0.024629
    1.206120   0.895101   1.075549   1.897416   1.383577
   ```

1. 「`octave-sample-data-{{your-aws-account-id}}`」 という Amazon S3 バケットを作成します。

1. 作成した Amazon S3 バケットにファイル「`input.txt`」 をアップロードします。これで、ファイル「`input.txt`」が含まれている `octave-sample-data-{{your-aws-account-id}}` という名前のバケットができました。

**ステップ 4: コンテナの実行ロールを作成する**

1. 次の JSON を `role1.json` という名前のファイルにコピーします。{{your-aws-account-id}} を AWS アカウント ID に置き換え、{{aws-region}} を AWS リソースの AWS リージョンに置き換えます。
**注記**  
この例には、「混乱した代理」問題から保護するためのグローバル条件コンテキストキーが含まれています。詳細については、「[サービス間での不分別な代理処理の防止](cross-service-confused-deputy-prevention.md)」を参照してください。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": [
                       "sagemaker.amazonaws.com",
                       "iotanalytics.amazonaws.com"
                   ]
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceAccount": "{{123456789012}}"
                   },
                   "ArnLike": {
                       "aws:SourceArn": "arn:aws:iotanalytics:{{us-east-1}}:{{123456789012}}:dataset/{{your-dataset}}"
                   }
               }
           }
       ]
   }
   ```

------

1. ダウンロードした ファイルを使用して AWS IoT Analytics、SageMaker AI および へのアクセス許可を付与`role1.json`するロールを作成します。

   ```
   aws iam create-role --role-name container-execution-role --assume-role-policy-document file://role1.json
   ```

1. 「`policy1.json`」という名前のファイルに以下をダウンロードし、{{`your-account-id`}} を自分のアカウント ID に置き換えます `Statement:Resource` の下の 2 つ目の ARN を参照)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetBucketLocation",
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:PutObjectAcl"
               ],
               "Resource": [
                   "arn:aws:s3:*:*:dataset/*",
                   "arn:aws:s3:*:*:octave-sample-data-{{123456789012}}/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iotanalytics:*"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:GetAuthorizationToken",
                   "ecr:GetDownloadUrlForLayer",
                   "ecr:BatchGetImage",
                   "ecr:BatchCheckLayerAvailability",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:DescribeLogStreams",
                   "logs:GetLogEvents",
                   "logs:PutLogEvents"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetBucketLocation",
                   "s3:ListBucket",
                   "s3:ListAllMyBuckets"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. ダウンロードした「`policy.json`」ファイルを使用して、IAM ポリシーを作成します。

   ```
   aws iam create-policy --policy-name ContainerExecutionPolicy --policy-document file://policy1.json
   ```

1. ロールへのポリシーの付与

   ```
   aws iam attach-role-policy --role-name container-execution-role --policy-arn arn:aws:iam::{{your-account-id}}:policy/ContainerExecutionPolicy
   ```

**ステップ 5: コンテナアクションを使用してデータセットを作成する**

1. 「`cli-input.json`」という名前のファイルに以下をダウンロードし、{{`your-account-id`}} と {{`region`}} のすべてのインスタンスを適切な値に置き換えます。

   ```
   {
       "datasetName": "octave_dataset",
       "actions": [
           {
               "actionName": "octave",
               "containerAction": {
                   "image": "{{your-account-id}}.dkr.ecr.{{region}}.amazonaws.com/octave-moment",
                   "executionRoleArn": "arn:aws:iam::{{your-account-id}}:role/container-execution-role",
                   "resourceConfiguration": {
                       "computeType": "ACU_1",
                       "volumeSizeInGB": 1
                   },
                   "variables": [
                       {
                           "name": "octaveResultS3URI",
                           "outputFileUriValue": {
                               "fileName": "output.mat"
                           }
                       },
                       {
                           "name": "inputDataS3BucketName",
                           "stringValue": "octave-sample-data-{{your-account-id}}"
                       },
                       {
                           "name": "inputDataS3Key",
                           "stringValue": "input.txt"
                       },
                       {
                           "name": "order",
                           "stringValue": "3"
                       }
                   ]
               } 
           }
       ]
   }
   ```

1. ダウンロードして編集した「`cli-input.json`」ファイルを使用して、データセットを作成します。

   ```
   aws iotanalytics create-dataset —cli-input-json file://cli-input.json
   ```

**ステップ 6: データセットコンテンツの生成を呼び出す**

1. 以下のコマンドを実行してください。

   ```
   aws iotanalytics create-dataset-content --dataset-name octave-dataset
   ```

**ステップ 7: データセットコンテンツを取得する**

1. 以下のコマンドを実行してください。

   ```
   aws iotanalytics get-dataset-content --dataset-name octave-dataset --version-id \$LATEST
   ```

1. `DatasetContentState` が `SUCCEEDED` になるまで数分間かかる場合があります。

**ステップ 8: オクターブ で出力を印刷する**

1. オクターブ シェルを使用し、以下のコマンドを実行してコンテナからの出力を印刷します。

   ```
   bash> octave
   octave> load output.mat
   octave> disp(M)
   -0.016393 -0.098061 0.380311 -0.564377 -1.318744
   ```