FRMSKI開発ブログ

AWS、iOS、AR/VRなど開発メモ

【AWS】ECSのservice up時に「Deployment has not completed」が出た場合の対処法

ECSのservice upコマンドを実行すると、

NFO[0001] Updated ECS service successfully              desiredCount=1 force-deployment=false service=myappproject
INFO[0016] (service myappproject) has started 1 tasks: (task 95f042ea-6a93-4729-b89b-c0eebee4d32a).  timestamp="2019-07-02 13:28:15 +0000 UTC"
FATA[0304] Deployment has not completed: Running count has not changed for 5.00 minutes 

「Deployment has not completed」でタイムアウトエラー

ECSのタスク(下画面)のコンテナから

f:id:frmski:20190703215804p:plain

タスク詳細を見てみると、

CannotPullContainerError: Error response from daemon: Get https://294598740507.dkr.ecr.ap-northeast-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

とエラーが出ていることが判明。
Docker Imageの取得時のネットワークアクセスが許可されていないようでした。

ECSのクラスターからプロジェクトを選択し、ネットワーク構成では

f:id:frmski:20190703220616p:plain

パブリックIPの自動割り当てがDISABLEになっています。NATゲートウェイを使って外部にインターネット接続する方法もありますが、今回は自動割り当てをENABLEにすることで対処。

ビルド時のパラメータを指定するecs-params.ymlに「assign_public_ip: ENABLED」を追加することで解決しました。

version: 1
task_definition:
  ecs_network_mode: awsvpc
  task_execution_role: ecs-task-execution
  task_size:
    cpu_limit: 256
    mem_limit: 512
  services:
    myapp:
      essential: true
    nginx:
      essential: true


run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - subnet-096df842a99829e4f
        - subnet-07c7f04d0b61c3346
      security_groups:
        - sg-09d046dd7faac15f4
      assign_public_ip: ENABLED

DockerとDocker Composeをインストール〜ビルド方法

AWSへDjangoプロジェクトをデプロイするためにDocker Composeを使いました。 今回はDockerとDockerComposeのインストール手順を公開します。環境はMacです。

Dockerをインストール

f:id:frmski:20190623232641p:plain f:id:frmski:20190623232702p:plain

下記コマンドで正しくインストールされているか確認

$docker version

Docker Composeもついでにインストール

今回は使いませんがDocker Composeをインストールするために下記コマンドを実行

$sudo pip install -U docker-compose

バージョンが正しく表示されれば成功

$docker-compose --version

Dockerでビルド

まずはDockerでログイン

$docker login

Dockerfileを用意して下記コマンドでビルド

$ docker build -t [プロジェクト名] .

ARKit3.0が発表!新機能一覧

f:id:frmski:20190604102538j:plain

People Occlusion (ピープル・オクルージョン)

現実世界の人の後ろや前にAR空間を構築。ほぼあらゆる場所でグリーンスクリーンスタイル効果を可能にします。

Motion Capture(モーション・キャプチャ)

1台のカメラでリアルタイムに人の動きを捉えます。身体の位置や動きを一連の関節や骨として認識します。

Simultaneous Front and Back Camera(フロントとバックの同時カメラ)

前面カメラと背面カメラでフェイストラッキングとワールドトラッキングを同時に使用できるようになります。

Multiple Face Tracking(複数顔認識)

TrueDepthカメラを使用して、一度に最大3つの顔を追跡します。

Collaborative Sessions(共同セッション)

複数の人がライブコラボレーションセッションを行うことで、ユーザーがマルチプレイヤーゲームのような共有ARエクスペリエンスを利用できるようになります。

その他の改善

一度に最大100枚の画像を検出し、画像の物理的なサイズの自動見積もりを取得。 3Dオブジェクト検出がより確実になりました。 AIが、環境内の平面をより早く検出します。

参考サイト

https://developer.apple.com/augmented-reality/arkit/

UnityからAWS S3にオブジェクトがアップロードできない場合の対処法

UnityからAWSヘのネットワーク実装で

AWS Mobile SDK for Unity の使用開始 - AWS Mobile SDK

を使用しようとするとUnityのバージョンによっては下記のようなエラーが出る場合があります。

Amazon.Runtime.Internal.HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.

Unityのバージョン2017から若干ネットワークに関する仕様が若干変更したようです。(AWSのSDKは5..系のままアップデートされていない)

対処法は下記

  1. スクリプトのコンストラクタでHttpClientの設定を変更
UnityInitializer.AttachToGameObject(this.gameObject);
AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;
  1. S3にオブジェクトをアップロードする場合はリクエストにリージョンを追加
var request = new PostObjectRequest()
{
          Bucket = S3BucketName,
          Key = fileName,
          InputStream = stream,
          CannedACL = S3CannedACL.Private,
          Region = _S3Region
};

これでSDKが正常に動作します。

【AWS】Code BuildでLambdaを更新するbuildspec.yml

Code Buildではbuildspec.ymlを追加することでgitと連携してデプロイすることがでいます。

gitのファイル構成は下記がシンプルな例

.
├── buildspec.yml
├── lambda1
│   └── lambda_function.py
├── requirements.txt

下記はbuildspec.yml

version: 0.2

phases:
  install:
    runtime-versions:
        python: 3.7
  build:
    commands:
      - zip -r {関数名}.zip ./
      - aws s3 cp {関数名}.zip s3://{バケット名}/
      - aws lambda update-function-code --function-name {関数名} --s3-bucket {バケット名} --s3-key {関数名}.zip

Pythonでのglobalの扱い方

Pythonではglobalを変数の前につけることでグローバル変数として扱える。下記例。

通常
var = 1
def test():
 var = 2
test()
print(var) #1
globalを使った例
var = 1
def test():
   global var
   var = 2
test()
print(var) #2