SORACOM Funnelで、AWSアクセスキーを利用せずにデータをIoT Coreに送信する

最初からこうすればよかった。
2023.10.24

SORACOM Funnelを利用すれば、SORACOM SIMを利用するデバイスからのデータを簡単にAWSに転送できます。 このSORACOM Funnelですが、いままで、AWSアクセスキーを利用していましたが、「AWSアクセスキーを利用せず、IAMロールだけで実現できるのでは……?」と気づいたので、試してみました。

おすすめの方

  • SORACOM FunnelでAWSアクセスキーを利用したくない方
  • SORACOM FunnelをIAMロールで利用したい方
  • SORACOM Funnel用のIAMロールをCloudFormationで作成したい方

前提

SORACOM Funnel用のIAMロールを作成する

CloudFormationテンプレート

ExternalIdは、UUIDなど推測されにくいランダムな文字列にすることをおすすめします。

iam.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: IAM Role for SORACOM Funnel

Parameters:
  SoracomPrincipalAwsAccountId:
    Type: String
    Default: "762707677580" # 日本カバレッジ:762707677580, グローバルカバレッジ:950858143650

  SoracomExternalId: 
    Type: String

Resources:
  SoracomFunnelRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: soracom-funnel-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              AWS:
                - !Ref SoracomPrincipalAwsAccountId 
            Condition:
              StringEquals:
                sts:ExternalId: !Ref SoracomExternalId
      Policies:
        - PolicyName: soracom-funnel-role-policy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action: iot:Publish
                Resource: !Sub "arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topic/soracom/gps-multiunit/*"

Outputs:
  SoracomFunnelRoleArn:
    Value: !GetAtt SoracomFunnelRole.Arn

デプロイ

aws cloudformation deploy \
	--template-file iam.yml \
	--stack-name SORACOM-Funnel-IAM-Role-Stack \
	--capabilities CAPABILITY_NAMED_IAM \
	--no-fail-on-empty-changeset

作成したIAMロールのARNを取得する

aws cloudformation describe-stacks \
    --stack-name SORACOM-Funnel-IAM-Role-Stack \
    --query 'Stacks[].Outputs'

[
    [
        {
            "OutputKey": "SoracomFunnelRoleArn",
            "OutputValue": "arn:aws:iam::123456789012:role/soracom-funnel-role"
        }
    ]
]

SORACOM Funnelを設定してAWS IoT Coreにデータ送信する

SORACOMにIAMロールの情報を登録する

SORACOM Webコンソールにアクセスし、右上のメニューにある「セキュリティ」を選択します。

SORACOMのメニューからセキュリティを選択する

続いて、「認証情報ストア」にある「認証情報を登録」を選択します。

SORACOMの認証情報ストアを選択する

種別は「AWS IAMロール認証情報」を選択し、適当な「認証情報ID」を入力し、さきほどの「IAMロールのARN」と「外部ID」を入力します。

SORACOMの認証情報ストアにAWS IAM認証情報を登録する

最後に「登録」を押して完了です。

AWS IoT Coreエンドポイント取得

下記コマンドで取得できます。

aws iot describe-endpoint \
    --endpoint-type iot:Data-ATS

SORACOM Funnelを設定する

メニューの「SIMグループ」からデバイス(GPSマルチユニット)が所属しているSIMグループを選択します。

SORACOMのSIMグループを選択する

SORACOM Funnelを設定し、保存します。

項目 内容
転送先サービス AWS IoT
転送先URL xxxxx.iot.ap-northeast-1.amazonaws.com/soracom/gps-multiunit/#{imsi}
認証情報 さきほど登録した認証情報
送信データ形式 JSON

SORACOM Funnelを設定する

AWS IoT Coreでデータ受信を確認する

IoT Coreの「MQTT テストクライアント」にアクセスして、次のトピックをサブスクライブします。

  • soracom/gps-multiunit/+

しばらく待つと、データが表示されました。

AWS IoT Coreにデータが来た

さきほどSORACOM認証情報ストアに登録した認証情報IDがcredentialsIdに設定されています。バッチリですね。

SORACOM 認証情報ストアの「最終使用日時」を確認する

利用日時が更新されていました。

AWS認証情報ストアの最終使用日時が更新された

さいごに

SORACOM Funnelで、AWSアクセスキーを利用せずにデータをIoT Coreで受け取ってみました。 いままでAWSアクセスキーを利用しており、AWSアクセスキーのローテーションが手間でしたが、この仕組みを使えばAWSアクセスキー自体が不要になりますね。

参考